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
- if "[" in substring of s[from index pos to end], then
- otherwise,
- insert s[from index pos to end] at the end of seq
- helper(n)
- delete last element from seq
- if pos is same as n, then
- 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
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']