Formatted question description: https://leetcode.ca/all/784.html
Level
Easy
Description
Given a string S, we can transform every letter individually to be lowercase or uppercase to create another string. Return a list of all possible strings we could create.
Examples:
Input: S = "a1b2"
Output: ["a1b2", "a1B2", "A1b2", "A1B2"]
Input: S = "3z4"
Output: ["3z4", "3Z4"]
Input: S = "12345"
Output: ["12345"]
Note:
S
will be a string with length between1
and12
.S
will consist only of letters or digits.
Solution
First obtain all the indices where the character is a letter. Next obtain all possible permutations using the idea of binary numbers, and for each permutation, set the letters to lowercase and uppercase accordingly, and add the string to the result list.
-
public class Letter_Case_Permutation { class Solution { public List<String> letterCasePermutation(String S) { if (S == null) { return new LinkedList<>(); } List<String> res = new LinkedList<>(); helper(S.toCharArray(), res, 0); return res; } public void helper(char[] chs, List<String> res, int pos) { if (pos == chs.length) { res.add(new String(chs)); return; } if (chs[pos] >= '0' && chs[pos] <= '9') { helper(chs, res, pos + 1); return; } chs[pos] = Character.toLowerCase(chs[pos]); helper(chs, res, pos + 1); chs[pos] = Character.toUpperCase(chs[pos]); helper(chs, res, pos + 1); } } }
-
// OJ: https://leetcode.com/problems/letter-case-permutation/ // Time: O(2^N) // Space: O(N) class Solution { private: vector<string> ans; void dfs(string &S, int i) { while (i < S.size() && !isalpha(S[i])) ++i; if (i == S.size()) { ans.push_back(S); return; } dfs(S, i + 1); S[i] += ('A' - 'a') * ((S[i] >= 'a' && S[i] <= 'z') ? 1 : -1); dfs(S, i + 1); } public: vector<string> letterCasePermutation(string S) { dfs(S, 0); return ans; } };
-
class Solution(object): def letterCasePermutation(self, S): """ :type S: str :rtype: List[str] """ res = [] self.dfs(S, 0, res, '') return res def dfs(self, string, index, res, path): if index == len(string): res.append(path) return else: if string[index].isalpha(): self.dfs(string, index + 1, res, path + string[index].upper()) self.dfs(string, index + 1, res, path + string[index].lower()) else: self.dfs(string, index + 1, res, path + string[index])