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>();

 

posted on 2018-11-11 08:06  KeepAC  阅读(131)  评论(0编辑  收藏  举报