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