【LeetCode】电话号码的字母组合Java题解

{"type":"doc","content":[{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"题目描述","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n示例 1:\n\n输入:digits = \"23\"\n输出:[\"ad\",\"ae\",\"af\",\"bd\",\"be\",\"bf\",\"cd\",\"ce\",\"cf\"]\n\n示例 2:\n\n输入:digits = \"\"\n输出:[]\n\n示例 3:\n\n输入:digits = \"2\"\n输出:[\"a\",\"b\",\"c\"]\n\n来源:力扣(LeetCode)\n链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number\n著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。\n","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"思路分析","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"今天的算法每日一题是电话号码的字母组合问题,题意明了,接近现实。题目要求我们枚举出所有组合的情况。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我们首先需要根据 digits 找出 digit 对应的 letters, 一般采用 hashMap 的方式存储,提升查找效率。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"除了1之外,每个 digit 对应 3 个 letter。因此,我们需要遍历 letters, 对于每一个 letter 都有选和不选两种情况,我们分别处理。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"dfs 的终止条件是 当前 digit 的索引位置,等于 digits.length()。具体实现代码如下:","attrs":{}}]}]}],"attrs":{}},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"通过代码","attrs":{}}]},{"type":"codeblock","attrs":{"lang":"java"},"content":[{"type":"text","text":"class Solution {\n public List letterCombinations(String digits) {\n List ans = new ArrayList<>();\n if (digits.length() == 0) {\n return ans;\n }\n\n Map phoneMap = new HashMap() {{\n put('2', \"abc\");\n put('3', \"def\");\n put('4', \"ghi\");\n put('5', \"jkl\");\n put('6', \"mno\");\n put('7', \"pqrs\");\n put('8', \"tuv\");\n put('9', \"wxyz\");\n }};\n\n\n dfs(ans, phoneMap, digits, 0, new StringBuffer());\n\n return ans;\n }\n\n\n public void dfs(List ans, Map phoneMap, String digits, int index, StringBuffer combination) {\n if (index == digits.length()) {\n ans.add(combination.toString());\n return;\n }\n\n char digit = digits.charAt(index);\n String letters = phoneMap.get(digit);\n int lettersCount = letters.length();\n for (int i = 0; i < lettersCount; i++) {\n combination.append(letters.charAt(i));\n dfs(ans, phoneMap, digits, index + 1, combination);\n combination.deleteCharAt(index);\n }\n }\n}\n","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":1},"content":[{"type":"text","text":"总结","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"今天这个题目非常好,贴近实际,易于理解。结合了 dfs, hashmap 等知识考核。我们需要多练习几次,掌握知识的综合应用。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"坚持算法每日一题,加油!","attrs":{}}]}]}],"attrs":{}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章