leetcode 17.电话号码的字母组合
题目描述
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
解题思路
回溯法
算法框架:递归出口设计、目标条件的选择、递归、状态重置。
按照上面的框架代码如下
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> res; // 存放所有的组合
string track=""; // 存放字符的组合
digitsToStr = {{'2',"abc"},{'3',"def"},{'4',"ghi"},{'5',"jkl"},{'6',"mno"},{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"}}; // 初始化,每个数字对应的字符串
backTrack(res, digits, track, 0);
return res;
}
void backTrack(vector<string>& res, string digits, string track, int index){
// 步骤1:递归出口(当满足track的长度和数组的长度一样长的时候,直接返回,一个数字对应一个字符)
if(track.size() == digits.size()){
if(track.size() == 0){
return; // 这里是digits为空的时候,直接返回,否则返回res中会有默认初始化的 "" 字符串
}
res.push_back(track);
return ;
}
// 步骤二:目标路径的选择,不断的向track里添加字符
for(int i=index; i<digits.size(); i++){
string temp = digitsToStr[digits[i]];
for(int j=0; j<temp.size(); j++){
track.insert(track.begin()+track.size(), temp[j]); // track更新
backTrack(res, digits, track, i+1); // 步骤三:递归
track.erase(track.begin()+track.size()-1); // 步骤四:状态重置
}
}
}
unordered_map<char, string> digitsToStr; // 创建一个public遍历,供类中的成员方法使用
};
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步