LeetCode17. Letter Combinations of a Phone Number电话号码组合

17. 电话号码组合

17. Letter Combinations of a Phone Number

Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent.

A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.

Example:

Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
深度优先遍历(DFS)

首先先定义一个map映射为手机键盘上的数组,如2对应的是abc。这使用下标表示数字,所以对下标为0和1的值设置为空字符串。

我们可以将这个想象成一棵树来进行深度优先遍历。其中数字的长度所代表的是这棵树的层数。而对于某一层而言,所有节点的值都为对应该层数字的映射的字符。如数字2对应的层数的节点值必为a,b,c。然后进行深度遍历,到根节点即所给字符串的末尾结束遍历。

class Solution {
    private String[] map = {
    "",
    "",
    "abc",
    "def",
    "ghi",
    "jkl",
    "mno",
    "pqrs",
    "tuv",
    "wxyz"
    };
    private List<String> result;
    public List<String> letterCombinations(String digits) {
        result = new ArrayList<>();
        if(digits == null || digits.length() == 0){
            return result;
        }
        
        combineDigits(digits,0,new StringBuilder());
        return result;
    }
    
    public void combineDigits(String digits,int index,StringBuilder sb){
        if(index == digits.length()){
            result.add(sb.toString());
            return;
        }
        
        char c = digits.charAt(index);
        String letters = map[c - '0'];
        for(int i = 0; i < letters.length(); i++){
            combineDigits(digits,index + 1, sb.append(letters.charAt(i)));
            sb.deleteCharAt(sb.length() - 1);
        }
    }       
}
直接拼接

直接拼接很简单,就是扫描数字,每一个数字对应的字符和之前的得到的字符串进行拼接,然后更新字符串。

class Solution {
    Map<Character,String[]> digitToLetterMap = new HashMap<>(){{
        put('2',new String[]{"a","b","c"});
        put('3',new String[]{"d","e","f"});
        put('4',new String[]{"g","h","i"});
        put('5',new String[]{"j","k","l"});
        put('6',new String[]{"m","n","o"});
        put('7',new String[]{"p","q","r","s"});
        put('8',new String[]{"t","u","v"});
        put('9',new String[]{"w","x","y","z"});
    }};
    
    private List<String> result;
    
    public List<String> letterCombinations(String digits) {
       if(digits==null || digits.length() == 0) {
            return new ArrayList();
        }
        
        result = Arrays.asList(digitToLetterMap.get(digits.charAt(0)));
        
        int i=1;
        while (i<digits.length()){
            combineTwoDigits(digitToLetterMap.get(digits.charAt(i)));
            i++;
        }       
        return result;
    }
    
    private void combineTwoDigits(String[] letters){        
        List<String> re = new ArrayList<>(result.size() * letters.length);
        for(int i=0;i<result.size();i++){
            for(int j=0;j<b.length;j++){
                StringBuilder sb = new StringBuilder();
                sb.append(result.get(i));
                sb.append(letters[j]);
                re.add(sb.toString());
            }
        }
        result = re;
    }      
}
发布了36 篇原创文章 · 获赞 8 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_32763643/article/details/104346854
今日推荐