1. 程式人生 > 實用技巧 >【LeetCode】17. 電話號碼的字母組合(回溯)

【LeetCode】17. 電話號碼的字母組合(回溯)

題目連結

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;
    }
}