回溯思想应用:001.LeetCode:17. 电话号码的字母组合

class Solution {
private:

    const string letterMap[10]={
        " ",    //0
        "",     //1
        "abc",  //2
        "def",  //3
        "ghi",  //4
        "jkl",  //5
        "mno",  //6
        "pqrs", //7
        "tuv",  //8
        "wxyz"  //9
    };

    vector<string>res;

    //s中保存了此时从digits[0..index-1]翻译得到的一个字母字符串
    //函数用来寻找digits[index]能够匹配到的字母,获得digits[0..index]
    //翻译得到的解
    void findCombination(const string &digits,int index,const string &s)
    {
        cout<<index<<" : "<<s<<endl;
        if(index==digits.size())//此时遍历了整个数字字符串中的一个,说明这个时候得到了其中一个解,开始时回溯
        {
            //保存s
            res.push_back(s);
            cout<<"get "<<s<<" ,return"<<endl;
            return;
        }
        char c=digits[index];//得到当前的字符
        assert(c>='0'&&c<='9'&&c!='1');
        string letters=letterMap[c-'0'];//提取当前数字对应的字母字符串
        for(int i=0;i<letters.size();i++)
        {
            //递归的寻找
            cout<<"digits["<<index<<"] = "<<c<<" , use "<<letters[i]<<endl;
            findCombination(digits,index+1,s+letters[i]);//将letters[i]接在原有路径经过的节点构成字符串的后面

        }
        cout<<"digits["<<index<<"] = "<<c<<" complete,return"<<endl;
        return;
    }

public:
    vector<string> letterCombinations(string digits) {
        res.clear();//显示的在初始化的时候将字符串设置为空
        if(digits.size()==0)
        {
            return res;
        }
        findCombination(digits,0,"");
        return res;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章