我的思路:
一個字元對應多種選擇,需要遍歷整個狀態空間才能得到所求的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的套路性求解
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;
}
};