给定一个字符串S
,通过将字符串S
中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。
示例: 输入: S = "a1b2" 输出: ["a1b2", "a1B2", "A1b2", "A1B2"] 输入: S = "3z4" 输出: ["3z4", "3Z4"] 输入: S = "12345" 输出: ["12345"]
注意:
S
的长度不超过12
。S
仅由数字和字母组成。
【解题思路】
使用回溯,遇到数字直接进入下一层,遇到字母的时候先转换,再递归,最后记得把大小写变回来。
class Solution {
public:
vector<string> letterCasePermutation(string S) {
vector<string> res;
backtrade(res,S,0);
return res;
}
void backtrade(vector<string>& res,string S,int pos){
if(pos == S.size()){
res.push_back(S);
return;
}
if(S[pos] <= 'z' && S[pos] >= 'a'){
S[pos] -= 32;
backtrade(res,S,pos+1);
S[pos] += 32;
}
if(S[pos] <= 'Z' && S[pos] >= 'A'){
S[pos] += 32;
backtrade(res,S,pos+1);
S[pos] -= 32;
}
backtrade(res,S,pos+1);
}
};
然后优化一下:
class Solution {
public:
vector<string> letterCasePermutation(string S) {
vector<string> res;
backtrade(res,S,0);
return res;
}
void backtrade(vector<string>& res,string S,int pos){
if(pos == S.size()){
res.push_back(S);
return;
}
if( isalpha(S[pos]) ){
S[pos] ^= 32;//大小写转换
backtrade(res,S,pos+1);
S[pos] ^= 32;//再换回来
}
backtrade(res,S,pos+1); //不是字母直接回溯
}
};