Letter Case Permutation

medium backtracking dfs strings

Problem

Given a string, return all possible strings obtained by toggling the case of each letter (digits unchanged).

Inputs='a1b2'
Output['a1b2','a1B2','A1b2','A1B2']
Each letter has two case choices.

def letterCasePermutation(s):
    res = []
    def dfs(i, cur):
        if i == len(s):
            res.append("".join(cur)); return
        if s[i].isalpha():
            cur.append(s[i].lower()); dfs(i+1, cur); cur.pop()
            cur.append(s[i].upper()); dfs(i+1, cur); cur.pop()
        else:
            cur.append(s[i]); dfs(i+1, cur); cur.pop()
    dfs(0, [])
    return res
function letterCasePermutation(s) {
  const res = [];
  function dfs(i, cur) {
    if (i === s.length) { res.push(cur); return; }
    if (/[a-zA-Z]/.test(s[i])) {
      dfs(i+1, cur + s[i].toLowerCase());
      dfs(i+1, cur + s[i].toUpperCase());
    } else dfs(i+1, cur + s[i]);
  }
  dfs(0, "");
  return res;
}
List<String> res = new ArrayList<>();
List<String> letterCasePermutation(String s) {
    dfs(s, 0, new StringBuilder());
    return res;
}
void dfs(String s, int i, StringBuilder cur) {
    if (i == s.length()) { res.add(cur.toString()); return; }
    char c = s.charAt(i);
    if (Character.isLetter(c)) {
        cur.append(Character.toLowerCase(c)); dfs(s, i+1, cur); cur.deleteCharAt(cur.length()-1);
        cur.append(Character.toUpperCase(c)); dfs(s, i+1, cur); cur.deleteCharAt(cur.length()-1);
    } else {
        cur.append(c); dfs(s, i+1, cur); cur.deleteCharAt(cur.length()-1);
    }
}
vector<string> res;
void dfs(string& s, int i, string& cur) {
    if (i == (int)s.size()) { res.push_back(cur); return; }
    if (isalpha(s[i])) {
        cur.push_back(tolower(s[i])); dfs(s, i+1, cur); cur.pop_back();
        cur.push_back(toupper(s[i])); dfs(s, i+1, cur); cur.pop_back();
    } else {
        cur.push_back(s[i]); dfs(s, i+1, cur); cur.pop_back();
    }
}
vector<string> letterCasePermutation(string s) {
    string cur;
    dfs(s, 0, cur);
    return res;
}
Time: O(2^n * n) Space: O(n)