这个题的思想很重要,两种方法
第一种,回溯法
1 class Solution 2 { 3 public: 4 int sz; 5 vector<string> letterCasePermutation(string S) 6 { 7 vector<string> res; 8 sz=S.size(); 9 backtrack(S,0,res); 10 return res; 11 } 12 13 void backtrack(string &s,int i,vector<string> &res) 14 { 15 if(i==sz) 16 { 17 res.push_back(s); 18 return ; 19 } 20 backtrack(s,i+1,res); 21 if(isalpha(s[i])) 22 { 23 s[i]^=(1<<5); 24 backtrack(s,i+1,res); 25 } 26 } 27 };
这个方法是先扫到末尾,再往回走,往回时遇到一个字母,改变其大小写,然后再把这个序列扫到末尾,改变之后的字母大小写。往回扫到第一个字符时,结束运行,输出结果。
第二种,顺序法
1 class Solution 2 { 3 public: 4 int sz; 5 vector<string> letterCasePermutation(string S) 6 { 7 vector<string> res; 8 sz=S.size(); 9 letterCasePermutation(S,0,res); 10 return res; 11 } 12 13 void letterCasePermutation(string &s,int idx,vector<string> &res) 14 { 15 res.push_back(s); 16 for(int i=idx;i<sz;i++) 17 { 18 char temp=s[i]; 19 if(isalpha(s[i])) 20 { 21 s[i]^=(1<<5); 22 letterCasePermutation(s,i+1,res); 23 } 24 s[i]=temp; 25 } 26 } 27 };
这个方法和回溯法有点类似,只是这个是从头扫到尾,扫到第一个字符,改变大小写,然后递归,扫之后的字符。递归完成后,说明改变这个字符之后,右边字符序列改变的组合已经完成了。然后把字符变回去,继续向右扫,直到扫描完成。
浙公网安备 33010602011771号