题目描述
解法一:递归(C++)
class Solution {
public:
vector<string> ans;
void dfs(string& S, int indx){
if(indx==S.size())
{
ans.push_back(S);
return;
}
dfs(S, indx+1);
if(isalpha(S[indx]))
{
S[indx] = S[indx]^32;
dfs(S, indx+1);
}
}
vector<string> letterCasePermutation(string S) {
dfs(S, 0);
return ans;
}
};
解法二:非递归(C++)
我们先举个例子理解一下递归解法的搜索树
非递归的思想很简单,就是遇到一个字母就将其进行大小变换后的结果和不进行变换的结果一起放入结果集
以上面例子就是,最开始结果集中只有 a n s = { a 1 b 2 } ans=\left \{ a1b2 \right \} ans={a1b2}
遇到第一个字符 a,将结果集中的字符串变换 a 后的两种结果放入结果集中,即 a n s = { a 1 b 2 , A 1 b 2 } ans=\left \{ a1b2,\ A1b2 \right \} ans={a1b2, A1b2}
接下来遇到第二个字符 a,将结果集中的字符串变换 b 后的两种结果放入结果集中,即 a n s = { a 1 b 2 , a 1 B 2 , A 1 b 2 , A 1 B 2 } ans=\left \{ a1b2,\ a1B2,\ A1b2,\ A1B2 \right \} ans={a1b2, a1B2, A1b2, A1B2}
class Solution {
public:
vector<string> letterCasePermutation(string S) {
vector<string> ans{S};
for(int i = 0; i < S.size(); i++){
if(isalpha(S[i])){
for(int j = ans.size() - 1; j >= 0; j--){
ans.push_back(ans[j]);
ans[j][i] = ans[j][i]^32;
}
}
}
return ans;
}
};