Leetcode第17题:电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

说明:

尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

思路:首先将所有按键的字母放入一个集合;然后使用递归回溯的方法;例如输入是23;对应"abc" "def";首先循环"abc",对于每一个字母,然后在递归调用"def"的遍历

class Solution {
    public List<String> letters = new ArrayList<String>(8);
    public List<String> list = new ArrayList<String>();

    public void prepareForList(){
        letters.add("abc");
        letters.add("def");
        letters.add("ghi");
        letters.add("jkl");
        letters.add("mno");
        letters.add("pqrs");
        letters.add("tuv");
        letters.add("wxyz");
    }

    public List<String> letterCombinations(String digits) {
        if(digits == null || digits.length() == 0){
            return list;
        }
        prepareForList();
        letterCombinations(list, digits, 0, "");
        return list;
    }

    /**
     *
     * @param list 存放最后结果的list
     * @param digits 输入的数字字符串
     * @param index 当前遍历digits的下标
     * @param curr 当前的字符串
     * @return
     */
    public void letterCombinations(List<String> list, String digits, int index, String cur){
        if (index == digits.length()){
            if (index == digits.length()){
                //说明遍历了一遍了,需要加入list
                list.add(cur);
            }
            return;
        }
        //获取数字所对应的字符串
        String temp = letters.get(digits.charAt(index) - '2');

        for (int i = 0, len = temp.length(); i < len; i++){
            String next = cur + temp.charAt(i);
            letterCombinations(list, digits, index+1, next);
        }

    }
}

猜你喜欢

转载自blog.csdn.net/lmt_1234567890/article/details/79986692