方法一:
- 从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, 还需要再变回来。