784 Letter Case Permutation 字母大小寫全排列
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.
Example:
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 between 1 and 12.
S will consist only of letters or digits.
題目描述:
給定一個(gè)字符串S朽基,通過將字符串S中的每個(gè)字母轉(zhuǎn)變大小寫,我們可以獲得一個(gè)新的字符串。返回所有可能得到的字符串集合。
示例 :
輸入: S = "a1b2"
輸出: ["a1b2", "a1B2", "A1b2", "A1B2"]
輸入: S = "3z4"
輸出: ["3z4", "3Z4"]
輸入: S = "12345"
輸出: ["12345"]
注意:
S 的長度不超過12。
S 僅由數(shù)字和字母組成亚隅。
思路:
回溯法, 大小寫轉(zhuǎn)換可以使用 s[i] ^= (1 << 5), 實(shí)際上是大小寫的 ascii碼剛好相差 32
時(shí)間復(fù)雜度O(2 ^ n), 空間復(fù)雜度O(1), n表示字符串的長度
代碼:
C++:
class Solution
{
public:
vector<string> letterCasePermutation(string S)
{
vector<string> result;
traceback(result, S, 0);
return result;
}
private:
void traceback(vector<string> &result, string s, int len)
{
if (len == s.size())
{
result.push_back(s);
return;
}
traceback(result, s, len + 1);
if (s[len] > '9')
{
s[len] ^= (1 << 5);
traceback(result, s, len + 1);
}
}
};
Java:
class Solution {
public List<String> letterCasePermutation(String S) {
List<String> result = new ArrayList<>();
traceback(result, S.toCharArray(), 0);
return result;
}
private void traceback(List<String> result, char[] s, int len) {
if (len == s.length) {
result.add(String.valueOf(s));
return;
}
traceback(result, s, len + 1);
if (s[len] > '9') {
s[len] ^= (1 << 5);
traceback(result, s, len + 1);
}
}
}
Python:
class Solution:
def letterCasePermutation(self, S: str) -> List[str]:
if not S:
return [S]
rest = self.letterCasePermutation(S[1:])
if S[0].isalpha():
return [S[0].lower() + s for s in rest] + [S[0].upper() + s for s in rest]
return [S[0] + s for s in rest]