Rdkit, which is widely used in cheminformatics, can generate a list of valid smiles strings for a given molecule. That sounds like exactly what you are looking for. More info found here:
SMILES doesn't define a particular order in which the atoms show up in the string. Hence the position in the molecule where software starts printing will determine the string. E.g. for CO2:
Ketcher prints C(=O)=O (starts with C and considers one of the O's a branch)
MarvinJS prints O=C=O (starts iteration with O, hence no branching)
Both of these ...