最朴素的回溯:
class Solution {
public:
vector<string> letterCasePermutation(string S) {
string tmp = "";
vector<string> ans;
LetterCase(0, S, ans, tmp);
return ans;
}
void LetterCase(int index, string s, vector<string>& ans, string tmp){
if(index == s.size()){
ans.push_back(tmp);
return;
}
if(isDigit(s[index])){
tmp += s[index];
LetterCase(index+1, s, ans, tmp);
}else{
tmp += tolower(s[index]);
LetterCase(index+1, s, ans, tmp);
tmp.erase(tmp.end()-1);
tmp += toupper(s[index]);
LetterCase(index+1, s, ans, tmp);
tmp.erase(tmp.end()-1);
}
}
bool isDigit(char s){
if(s >= '0' && s <= '9'){
return true;
}
return false;
}
};
时间和空间效率都不够好。
优化后:时间和空间效率都比较靠前了。
class Solution {
public:
vector<string> letterCasePermutation(string S) {
int sum = 1;
for(int i=0;i<S.size();i++){
if(isalpha(S[i])){
sum *= 2; // 字符串共有sum种形式
}
}
vector<string> result;
string tmp;
int tmp_sum = 0;
for(int i=0;i<sum;i++){
tmp_sum = i;
tmp = S;
for(int j=0;j<S.size();j++){
if(isalpha(S[j])){
if(tmp_sum % 2 == 1)
tmp[j] = toupper(S[j]);
if(tmp_sum % 2 == 0)
tmp[j] = tolower(S[j]);
tmp_sum = tmp_sum / 2;
}
}
result.push_back(tmp);
}
return result;
}
};