Given a string 'abc', find all distinct subsequence combinations of it.
This algorithm uses memoization to improve performance. It's same as the recursive version of Find all subsequence combinations of a string, but with a special 'cache' to store results. The 'cache key' is crucial. It's how we identify and store past results. Sometimes we need one key, sometimes multiple keys. We add code to:
cache = {} def combine(s): if len(s) == 0: return [] global cache if s[:-1] not in cache: l = combine(s[:-1]) cache[s[:-1]] = l + [x + s[-1] for x in l] + [s[-1]] return cache[s[:-1]] s = 'abc' print(combine(s))
const cache = {} function combine(s) { if (s.length === 0) { return []; } if (cache[s.slice(0, -1)] === undefined) { const l = combine(s.slice(0, -1)); cache[s.slice(0, -1)] = [...l, ...l.map(x => x + s.slice(-1)), s.slice(-1)]; } return cache[s.slice(0, -1)]; } const str = 'abc'; console.log(combine(str));