# Program to generate all possible strings by taking the choices in python

PythonServer Side ProgrammingProgramming

#### Beyond Basic Programming - Intermediate Python

Most Popular

36 Lectures 3 hours

#### Practical Machine Learning using Python

Best Seller

91 Lectures 23.5 hours

#### Practical Data Science using Python

22 Lectures 6 hours

Suppose we have a string s of lowercase alphabet characters, other characters like "[", "|", and "]". Here "[a|b|c]" indicates either "a", "b", or "c" can be chosen as a possibility. We have to find a list of strings containing all possible values that s can represent. Here "[]" cannot be nested and may have any number of choices.

So, if the input is like s = "[d|t|l]im[e|s]", then the output will be ['dime', 'dims', 'lime', 'lims', 'time', 'tims']

To solve this, we will follow these steps:

• if s is empty, then
• return a list with blank string
• n := size of s
• seq := a new list, res := a new list
• Define a function helper() . This will take pos
• if pos is same as n, then
• join each element present in seq and insert into res
• otherwise,
• if "[" in substring of s[from index pos to end], then
• start := pos + index of "[" in substring of s[from index pos to end]
• end := pos + index of "]" in substring of s[from index pos to end]
• for each option in the substring of s from start to end splitted by "|", do
• insert s[from index pos to start - 1] at the end of seq
• insert option at the end of seq
• helper(end + 1)
• delete last two elements from seq
• otherwise,
• insert s[from index pos to end] at the end of seq
• helper(n)
• delete last element from seq
• From the main method do the following:
• helper(0)
• return res in sorted order

Let us see the following implementation to get better understanding:

## Example

Live Demo

class Solution:
def solve(self, s):
if not s:
return [""]
n = len(s)

def helper(pos):
if pos == n:
res.append("".join(seq))
else:
if "[" in s[pos:]:
start = pos + s[pos:].index("[")
end = pos + s[pos:].index("]")
for option in s[start + 1 : end].split("|"):
seq.append(s[pos:start])
seq.append(option)
helper(end + 1)
seq.pop()
seq.pop()
else:
seq.append(s[pos:])
helper(n)
seq.pop()

seq = []
res = []
helper(0)
return sorted(res)

ob = Solution()
s = "[d|t|l]im[e|s]"
print(ob.solve(s))

## Input

"[d|t|l]im[e|s]"

## Output

['dime', 'dims', 'lime', 'lims', 'time', 'tims']
Updated on 26-Nov-2020 06:36:28