方法一:
- 从digits 的第一字符开始遍历
- 每次结果都是在之前的结果的基础上,加上当前数字可能的情况: 所以使用一个vector<string> result 存储每次加的结果;最开始为"";
- 创建一个当前的结果vector<string> temp:要遍历result中的每一个并且遍历当前字符的所有可能,组成新的字符串,加入result vector 中
class Solution { public: vector<string> letterCombinations(string digits) { vector<string> d={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; vector<string> result; if(digits.size()==0) return result; result.push_back(""); int k=digits.size(); for(int i=0;i<k;i++) { int c=digits[i]-'0'; if(c<0||c>9) break; cout<<c<<endl; vector<string>temp; for(int j=0;j<d[c].length();j++) { for(int m=0;m<result.size();m++) { cout<<d[c][j]<<endl; temp.push_back(result[m]+d[c][j]); } } result=temp; } return result; } };
方法二:
这道题类似之前的 遍历二叉树输出所有的路径的题。但是我太弱鸡,开始都没有用dfs做出来:
使用深度优先搜索:
- 把最终结果当成dfs 的参数,因为一直要改变,所以是一个引用类型,定义一个参数存储当前拼成的字符串
- dfs递归的终点,是这个数是最后一个数,
- 每次迭代的时候,改变当前拼成的字符串
void dfs(vector<string>& str,string save, string digits, int temp, int l) { vector<string> d={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; if(temp==l) { str.push_back(save); return; } int c=digits[temp]-'0'; int i=0; while(i<d[c].length()) { cout<<d[c][i]<<endl; dfs(str,save+d[c][i],digits,temp+1,l); i++; } } vector<string> letterCombinations(string digits) { vector<string> str; if(digits.size()==0) return str; string save; dfs (str,save, digits,0, digits.size()) ; return str;
在递归传递的时候要主要:
dfs(str,save+d[c][i],digits,temp+1,l);
表示传入的参数为save+d[c][i], 而递归之前的save 没有改变;
如果使用
save.push_back(d[c][i]);
dfs(str,save+d[c][i],digits,temp+1,l);
save.pop();
如果改变了save, 还需要再变回来。