【LeetCode Hot 100】17. 电话号码的字母组合
本题需要用回溯算法遍历穷举所有可能的解。回溯算法维护一个字符串序列,记录已经有的字母排列,用一个索引值记录该字符串序列下一个将要处理的位置。每次递归将索引值加一,回溯之后将字符串序列中上次加入的字符退出序列中,枚举下一个可能的值。总的来说是一个较为基础的回溯算法题目,我们可以用这个题目来理解回溯算法的基础知识。
// C++ class Solution { public: unordered_map<char, string> digit2letters = { {'2', "abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"}, {'6', "mno"}, {'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"}}; vector<string> result; void backtrace(string& digits, int idx, string& combination) { if (idx >= digits.length()) { result.push_back(combination); return; } string& possible = digit2letters[digits[idx]]; for (char c : possible) { combination.push_back(c); backtrace(digits, idx + 1, combination); combination.pop_back(); } } vector<string> letterCombinations(string digits) { if (digits.length() == 0) { return {}; } string combination = ""; backtrace(digits, 0, combination); return result; } }; // Java class Solution { public List<String> letterCombinations(String digits) { List<String> res = new ArrayList<>(); if (digits.length() == 0) { return res; } Map<Character, String> map = Map.of( '2', "abc", '3', "def", '4', "ghi", '5', "jkl", '6', "mno", '7', "pqrs", '8', "tuv", '9', "wxyz" ); StringBuffer combination = new StringBuffer(); backtrace(res, map, digits, 0, combination); return res; } public void backtrace(List<String> res, Map<Character, String> map, String digits, int idx, StringBuffer combination) { if (idx >= digits.length()) { res.add(combination.toString()); return; } String letters = map.get(digits.charAt(idx)); for (int i = 0; i < letters.length(); i++) { combination.append(letters.charAt(i)); backtrace(res, map, digits, idx + 1, combination); combination.deleteCharAt(idx); } } }
对于个人来说,Java解法的重点在于Java标准库的使用,比如Map
以及用于构建字符串的StringBuffer
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)