把回溯理一下

喜你入骨 提交于 2020-03-05 18:24:31

趁着这个题目把回溯算法理了一下。

看了一个博客写的很详细: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--;
        }
    }
};

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!