力扣习题——电话号码的字母组合
本期我们来做一个力扣上的习题,如标题所示,如下就是题目
相关题解代码已经上传至作者的个人gitee:楼田莉子/C++算法学习喜欢请支持一下谢谢
算法思路:哈希表+回溯
号码对应关系如下:
// 2 -> abc
// 3 -> def
// 4 -> ghi
// 5 -> jkl
// 6 -> mno
// 7 -> pqrs
// 8 -> tuv
// 9 -> wxyz
class Solution {
public:vector<string> ret; // 存储所有可能的字母组合结果string ans; // 当前正在构建的字母组合// 数字到字母的映射哈希表unordered_map<char, string> hash = {{'2', "abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"},{'6', "mno"}, {'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"}};// 回溯函数:digits为输入数字字符串,start为当前处理的数字索引,n为数字字符串长度void backtracking(string digits, int start, int n) {// 终止条件:当前组合长度等于数字串长度,说明已形成一个完整组合if (ans.size() == n) {ret.push_back(ans); // 将当前组合加入结果集return;}// 遍历数字字符串从start到末尾for (int i = start; i < n; i++) {// 获取当前数字对应的字母字符串string letters = hash[digits[i]];// 遍历当前数字的所有字母for (int j = 0; j < letters.size(); j++) {ans += letters[j]; // 将字母添加到当前组合backtracking(digits, i + 1, n); // 递归处理下一个数字(索引i+1)ans.erase(ans.end() - 1); // 回溯:删除刚才添加的字母,尝试下一个字母}}}//主函数vector<string> letterCombinations(string digits) {if (digits == "") return {}; // 如果输入为空,直接返回空数组int n = digits.size();backtracking(digits, 0, n); // 从索引0开始回溯return ret; }
};
本期这个题目就到这里结束了,喜欢请点个赞谢谢