思路很简单,就是通过map对应,随后通过递归调用,这里遇到了个问题就是开始用string &re ,然后往里传re+c是不可以的,本来想省点内存,结果不行,所以只能值传递了,后来才知道string
竟然还有push_back()和pop_back(),服了。
 1 class Solution {
 2 public:
 3     map<char,string> m;
 4     int length;
 5     vector<string> result;
 6     vector<string> letterCombinations(string digits) {
 7         m['2']="abc";
 8         m['3']="def";
 9         m['4']="ghi";
10         m['5']="jkl";
11         m['6']="mno";
12         m['7']="pqrs";
13         m['8']="tuv";
14         m['9']="wxyz";
15     int n=digits.length();
16     // vector<string> a;
17     // if(n==0) return a;
18     length=n;
19     string re="";
20     letterComb(digits,m,0,re);
21     return result;
22     }
23    void letterComb(string &digits,map<char,string> & m,int n,string re)               //这里用的值传递
24    {
25          if(n==length)
26         {
27              result.push_back(re);
28             return;
29         }
30         string tmp=m[digits[n]];
31         int l=tmp.length();
32         for(int i=0;i<l;i++)
33         {
34               char c=tmp[i];
35               letterComb(digits,m,n+1,re+c);                                     //string 类型可以加上char类型哦
36         }
37    }
38 
39 };
这里map还可以用
string str[8]={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};替代,只是注意每次要减‘2’,
string tmp=str[digits[i]-'2']
或者用 string strT[10] = {"","","abc","def","ghi","jkl","mno","qprs","tuv","wxyz"}; 这样是对应的,递归方法相同
修改后方法如下:
 1 class Solution {
 2 public:
 3     vector<string> result;
 4     int length;
 5     string m[8]={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
 6     
 7     vector<string> letterCombinations(string digits) {
 8     int n=digits.length();
 9     length=n;
10     string re="";
11     letterComb(digits,0,re);
12     return result;
13     }
14    void letterComb(string &digits,int n,string &re)
15    {
16          if(n==length)
17         {
18              result.push_back(re);
19              return;
20         }
21         string tmp=m[digits[n]-'2'];
22         int l=tmp.length();
23         for(int i=0;i<l;i++)
24         {
25               re.push_back(tmp[i]);               //这里string用push_back()和pop_back(),我也是第一次发现别人能这么用,厉害啊
26               letterComb(digits,n+1,re);
27               re.pop_back();
28         }
29    }
30 
31 };
 
 
方法二:还有个不递归的方法
 1 class Solution {
 2 public:
 3     vector<string> letterCombinations(string digits) {
 4     int n=digits.size();
 5     vector<string> result(1,"");
 6     string m[8]={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
 7     for(int i=0;i<n;i++)
 8     {
 9         string s=m[digits[i]-'2'];
10         int l=s.size();
11           int size=result.size();
11         for(int j=0;j<=size-1;j++)             //一定注意这里,必须先取得result.size(),否则会造成死循环
12         {
13             for(int k=0;k<l;k++)
14             {
15                if(k==l-1)            //当是最后一个时,就不能再push啦,不然就重了,要把自己改了
16                {
17                   result[j]+=s[k]; 
18                }
19                else
20                {
21                    result.push_back(result[j]+s[k]);
22                }
23             }
24         }
25     }
26     return result;
27     
28     }
29 
30 };