【LeetCode 52】17.电话号码的字母组合

【LeetCode 52】17.电话号码的字母组合

一、题意

二、解答过程

理解本题后,要解决如下三个问题:

  1. 数字和字母如何映射==用 map或者二维数组即可
  2. 两个字母就两个for循环,三个字符我就三个for循环,以此类推,然后发现代码根本写不出来==回溯算法可解决n个for循环的问题
  3. 输入1 * #按键等等异常情况

回溯三部曲:

  • 确定参数
  • 确定终止条件
  • 确定单层递归逻辑
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
    };

public:
    vector<string>result;
    string s;
    //1.
    void backtracking(const string& digits,int index)
    {
    
    
        //2.
        if(index==digits.size())
        {
    
    
            result.push_back(s);
            return;
        }

        int digit=digits[index]-'0';//将index指向的数字转换为int型
        string letters=letterMap[digit];//获取数字对应的字符集
        for (int i = 0; i < letters.size(); i++)
        {
    
    
            /* code */
            s.push_back(letters[i]);//处理
            backtracking(digits,index+1);//递归,注意index+1,下一层要处理下一个数字了

            s.pop_back();//回溯
        }
        

    }
    vector<string> letterCombinations(string digits) {
    
    
        s.clear();
        result.clear();
        if(digits.size()==0)
        {
    
    
            return result;
        }
        backtracking(digits,0);
        return result;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_43891901/article/details/123028519