这个题的思想很重要,两种方法

第一种,回溯法

 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 };

这个方法和回溯法有点类似,只是这个是从头扫到尾,扫到第一个字符,改变大小写,然后递归,扫之后的字符。递归完成后,说明改变这个字符之后,右边字符序列改变的组合已经完成了。然后把字符变回去,继续向右扫,直到扫描完成。

 

posted on 2018-06-13 16:28  高数考了59  阅读(268)  评论(0)    收藏  举报