【LeetCode】17. 電話號碼的字母組合(回溯)
阿新 • • 發佈:2020-08-26
題目連結
17. 電話號碼的字母組合
題目描述
解題思路
又是一題經典的回溯,連續2天LC題目都是利用回溯進行解決。
- 與
列印字串全部子序列
、Leetcode491遞增子序列
不同的是,本題需要利用一個hashmap去記錄各個數字與字串的對映關係。 - 還需要注意的一個點是:如果題目給出“234”,那輸出的字母組合的長度必須等於“234”.length(),也就是不能輸出“ad",必須輸出”adg"長度為3的字串,所以遞迴的條件需要變化。
AC程式碼
class Solution { Map<Character,String> mp = new HashMap<>(); List<String> ans = new LinkedList<>(); StringBuffer sb = new StringBuffer(); void dfs(int len,String digits,Map<Character,String> mp){ //遞迴的出口是len==digits.length(),len可以理解為深度。 //因為我們需要的答案正是當len==digits.length()完成的,所以我們必須先把答案新增到ans動態陣列中才可以結束本次遞迴。 if(sb.length()==digits.length()) ans.add(sb.toString()); if(len == digits.length()) return; for(int i = 0; i < mp.get(digits.charAt(len)).length(); i++){ sb.append(mp.get(digits.charAt(len)).charAt(i)); dfs(len+1,digits,mp); sb.deleteCharAt(sb.length()-1);//這句話最能體現出回溯的思想! } } public List<String> letterCombinations(String digits) { mp.put('2',"abc"); mp.put('3',"def"); mp.put('4',"ghi"); mp.put('5',"jkl"); mp.put('6',"mno"); mp.put('7',"pqrs"); mp.put('8',"tuv"); mp.put('9',"wxyz"); if(digits.length() == 0) return ans; dfs(0,digits,mp); return ans; } }