首页 > 代码库 > Letter Combinations of a Phone Number

Letter Combinations of a Phone Number

思路很简单,就是通过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 };