LeetCode-17-电话号码的字母组合

思路

  1. 使用哈希表存储每个数字对应的所有可能的字母,然后进行回溯操作,穷举所有可能。
  2. 使用队列,类似广度优先。

代码实现

1. 回溯

class Solution {
    public List<String> letterCombinations(String digits) {
        List<String> combinations = new ArrayList<String>();
        if (digits.length() == 0) {
            return combinations;
        }
        Map<Character, String> phoneMap = 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");
        }};
        backtrack(combinations, phoneMap, digits, 0, new StringBuffer());
        return combinations;
    }

    public void backtrack(List<String> combinations, Map<Character, String> phoneMap, String digits, int index, StringBuffer combination) {
        if (index == digits.length()) {
            //如果index扫描到最后一个数字(给定输入串digits的最后一个字符,则添加当前结果)
            combinations.add(combination.toString());
        } else {
            char digit = digits.charAt(index);
            //获取当前数字对应的字符序列
            String letters = phoneMap.get(digit);
            int lettersCount = letters.length();
            //遍历字符序列,每种情况进行尝试,递归,回溯
            for (int i = 0; i < lettersCount; i++) {
                combination.append(letters.charAt(i));
                backtrack(combinations, phoneMap, digits, index + 1, combination);
                combination.deleteCharAt(index);
            }
        }
    }
}

2. 队列

import java.util.*;

class Solution {
    public static void main(String[] args) {
        new Solution().letterCombinations("23");
    }
    public List<String> letterCombinations(String digits) {
        List<String> ans = new ArrayList<>();
        if (digits == null || digits.length() == 0){
            return ans;
        }
        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");
        }};
        Queue<StringBuilder> queue = new ArrayDeque<>();
        int index = 0;
        while (index < digits.length()){
            if (queue.isEmpty()){
                for (Character character : map.get(digits.charAt(index)).toCharArray()) {
                    queue.add(new StringBuilder().append(character));
                }
                index++;
                continue;
            }
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                StringBuilder temp = queue.poll();
                for (Character character : map.get(digits.charAt(index)).toCharArray()) {
                    queue.add(new StringBuilder().append(temp).append(character));
                }
            }
            index++;
        }
        for (StringBuilder s : queue) {
            ans.add(s.toString());
        }
        return ans;
    }
}
posted @ 2021-08-14 00:04  Cedrus  阅读(52)  评论(0)    收藏  举报