1. 程式人生 > >17. Letter Combinations of a Phone Number--back tracking--字元陣列

17. Letter Combinations of a Phone Number--back tracking--字元陣列

17 給出一個電話撥號盤,數字2-9代表一些字母,已知數字,求出所有字母的可能

例子 比如 求"23" , 2--->"abc" 3-->"def"

畫出遞迴數其實非常簡單:

和77. Combinations 本質上是一樣的, 都是求所排列問題,但和數字排列不同的時,每一次需要遍歷的陣列不是固定的,而是根據數的層數來決定的。所以需要設定一個tree_level, 每次遞迴都需要層數遞增,來選擇不同的字串code 如下:

class Solution {
    public List<String> letterCombinations(String digits) {
        
if(digits.length() == 0) return new ArrayList<String>(); String[] map = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; List<String> result = new ArrayList<>(); dfs(new StringBuilder(), result, digits,map, 0); return result; }
private void dfs(StringBuilder curResult, List<String> result, String digits, String[] map, int tree_level){ if(curResult.length() == digits.length()){ result.add(curResult.toString()); return; } String str = map[digits.charAt(tree_level)-'0'];
for(int j = 0; j<str.length(); j++){ curResult.append(str.charAt(j)); dfs(curResult, result,digits, map,tree_level+1); curResult.deleteCharAt(curResult.length()-1); } } }

還有當輸入字串為空串時, 返回的是 [] 而不是 [""], 因此在主程式裡需要判斷這種特殊情況。

 if(digits.length() == 0) return new ArrayList<String>();