一、题意
二、解答过程
理解本题后,要解决如下三个问题:
- 数字和字母如何映射==用
map
或者二维数组
即可 - 两个字母就两个for循环,三个字符我就三个for循环,以此类推,然后发现代码根本写不出来==
回溯算法可解决n个for循环的问题
- 输入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; } };