【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":{}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章