原題地址git
個人思路:
一個字符對應多種選擇,須要遍歷整個狀態空間才能獲得所求的ans,知足 dfs + backtracing組合求解模式。
1.每一個char對應的可能性是肯定的,map用來優化time cost
2.當前解的狀態應該用 & ,雖然不使用 & 在本題也能夠AC,出於backtracing 優化space cost的考慮,應該使用 &
3.dfs + backtring 的通常性套路即爲:
3.1 在dfs中優先判斷當前解是否爲可行解
3.2 剪枝,pass明顯不是解的狀態空間
3.3 對於當前狀態的全部可能的下行狀態,用for循環,每次遵循(1.加入狀態 2.dfs 3.撤回狀態)便可完成dfs + backtraing的套路性求解app
更多參考啓發優化
class Solution { public: map<int,string> mmp {{'2',"abc"},{'3',"def"},{'4',"ghi"},{'5',"jkl"}, {'6',"mno"},{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"}}; void dfs(vector<string> & vct,string &curans,string cur) { if(cur == "") { vct.push_back(curans); return; } string s = mmp[cur[0]]; cur = cur.substr(1); for(int i = 0;i< s.length();++i) { curans += s[i]; dfs(vct,curans,cur); curans = curans.substr(0,curans.length() - 1); } } vector<string> letterCombinations(string digits) { vector<string> vct; string s = ""; if(digits.length() <= 0) return vct; dfs(vct,s,digits); return vct; } };