17. Letter Combinations of a Phone Number

1 题目理解

给定一个字符串string,字符范围是[2,9]之间的数字。数字表示电话上的一个按钮。返回字符串的可能所有组合方式。每个数字对应的字母如下图所示。
17. Letter Combinations of a Phone Number
Example 1:

Input: digits = “23”
Output: [“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
Example 2:

Input: digits = “”
Output: []
Example 3:

Input: digits = “2”
Output: [“a”,“b”,“c”]

2 回溯

用回溯的方法可以解决。每次处理一个数字,每个数字对应3-4种转换。
这里我自己的一个小技巧是:dfs函数中的变量都是与状态相关的。其他变量都作为成员变量。这样可以更关注dfs过程中的状态。

class Solution {
    private Map<Character,String> map = new HashMap<Character,String>(){{
        put('2',"abc");
        put('3',"def");
        put('4',"ghi");
        put('5',"jkl");
        put('6',"mno");
        put('7',"pqrs");
        put('8',"tuv");
        put('9',"wxyz");
    }};
    private String digits;
    private List<String> answer;
    public List<String> letterCombinations(String digits) {
        answer = new ArrayList<String>();
        if(digits.length()==0) return answer;
        StringBuilder str = new StringBuilder();
        this.digits = digits;
        dfs(0,str);
        return answer;
    }
    private void dfs(int index,StringBuilder str){
        if(index == digits.length()){
            answer.add(str.toString());
        }else{
            String value = map.get(digits.charAt(index));
            for(int i=0;i<value.length();i++){
                str.append(value.charAt(i));
                dfs(index+1,str);
                str.setLength(str.length()-1);
            }
        }
    }
}
上一篇:LeetCode之电话号码的字母组合(十七)


下一篇:77. Combinations