回溯算法:电话号码的字母组合
个人理解:将每一层展开,将下一次节点的开始位置传入递归中
class Solution {
public:
vector<string> combinations;
string combination;
unordered_map<char,string> phoneMap
{
{'2', "abc"},
{'3', "def"},
{'4', "ghi"},
{'5', "jkl"},
{'6', "mno"},
{'7', "pqrs"},
{'8', "tuv"},
{'9', "wxyz"}
};
vector<string> letterCombinations(string digits)
{
if(digits.empty())
return combinations;
backtrack(digits,0);
return combinations;
}
void backtrack(string digits, int step)
{
//退出
if(step == digits.size())
{
combinations.push_back(combination);
return;
}
//开始位置
string str=phoneMap.at(digits[step]);
//每一层的宽度,递归展开
for(char & ch: str)
{
combination.push_back(ch);
//递归
backtrack(digits,step+1);
//回溯
combination.pop_back();
}
}
};