趁着这个题目把回溯算法理了一下。
看了一个博客写的很详细:https://segmentfault.com/a/1190000018319044
对于这道题,同样可以将输出的排列方式转化为n个解空间的解,n为输入串的数字个数。
关键在于,求出某一组解result=[s1,s2,s3,....sn]后,要回退到该组解的上一个状态,即result=[s1,s2,s3,....sn-1],并在该状态求出下一组解。所以在这道题的实现中,方法为将result保存在结果中,回溯到上一个状态后将最后一个字符去掉以达到回退到改组解上一个状态的目的。
对于回溯,递归是再合适不过了。
贴上代码:
class Solution {
public:
vector<string> alpha = {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
vector<string> letterCombinations(string digits) {
if(!digits.length())
return {};
int n = digits.length();
vector<string> result;
string tmp;
backtrace(0,digits,tmp,result);
return result;
}
void backtrace(int num,string digits,string tmp,vector<string> &result){
if(num==digits.length()){
result.push_back(tmp);
return;
}
for(int i=0;i<alpha[digits[num]-'2'].length();++i){
tmp += alpha[digits[num]-'2'][i];num++;
backtrace(num,digits,tmp,result);
tmp = tmp.substr(0,tmp.length() - 1);num--;
}
}
};
来源:CSDN
作者:Xuan;
链接:https://blog.csdn.net/qq_40128883/article/details/104670862