17. 电话号码的字母组合
1.回溯
-
回溯算法类似于枚举,不断尝试性的搜索,发现当前解不满足条件,就向前一步回退,搜索其他的可能性。
-
第一次看到这个题目可能不一定会想到**“回溯”,而是可能第一反应是“遍历”** ,这一题其实是一种更为简单的遍历,每次遍历的结果都是合格的结果,不需要排除掉结果。
-
class Solution { public: vector<string> result; string now_s,digits2; vector<string> keyBoard={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; int n; void DFS(int ind){ if(ind==n){//符合digits长度的结果就是最终结果 result.push_back(now_s); return; } int now_num=digits2[ind]-'0'; for(int i=0;i<keyBoard[now_num].size();i++){ now_s.push_back(keyBoard[now_num][i]);//每次试探性地将结果填入 DFS(ind+1); now_s.pop_back();//退回一步将这一步弹出,以便后面继续加元素 } } vector<string> letterCombinations(string digits) { n=digits.size(); digits2=digits; if(n==0) return result; DFS(0); return result; } };