2022-06-10 23:58阅读: 35评论: 0推荐: 0

力扣-17-电话号码的字母组合

首先,需要保存数字到字母的映射关系,第一反应当然就是map,确切地说,unordered_map
但其实这里应该是个一对多的关系,想到的要么一个键对应一个字符串,要么多个相同的键

像一个排列组合问题

直接看官方题解是回溯啊,以前也尝试过,感觉回溯好难

让我想起了力扣的回溯模板题——46-全排列

其实回看这两道题发现他俩其实非常相似,模板大概像是

返回值 主方法(参数){
声明一个返回值类型对象
检查输入是否非法
准备参数
调用回溯子函数
返回 返回值
}
返回值 回溯子函数(返回对象,输入参数,临时变量,索引长度,参数){
if(索引长度==参数长度){
临时变量放入结果集中
} //结束条件
for循环{
前置操作
递归调用自身
复原
}
}
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> combinations;
if(digits.empty()){
return combinations;
}
unordered_map<char,string> map{
{'2', "abc"},
{'3', "def"},
{'4', "ghi"},
{'5', "jkl"},
{'6', "mno"},
{'7', "pqrs"},
{'8', "tuv"},
{'9', "wxyz"}
};
string combination;
// 我想起来一般回溯法都会有一个回溯子函数
back_track(combinations,map,digits,0,combination);
return combinations;
}
// 这里细节的点是形参的const关键字,防止参数被更改
void back_track(vector<string>& combinations,const unordered_map<char,string>& map,const string& digits,int index,string& combination){
// 如果组合出的字符长度等于数字位数
if(index==digits.length()){
combinations.push_back(combination);
}else{
char digit = digits[index];
// 获取当前索引的数字
const string& letters = map.at(digit);// 获取数字对应的字符(串)
for(const char& letter:letters){
combination.push_back(letter);
back_track(combinations, map, digits, index + 1, combination);
combination.pop_back();
// 回退当前位置插入的元素,换上另一个可能元素
}
}
}
};

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/16365043.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(35)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起