利用队列求解

public ArrayList<String> letterCombinations(String digits) {
    ArrayList<String> res = new ArrayList<String>();
    HashMap<Character, String> dict = new HashMap<Character, String>();
    dict.put('2', "abc");
    dict.put('3', "def");
    dict.put('4', "ghi");
    dict.put('5', "jkl");
    dict.put('6', "mno");
    dict.put('7', "pqrs");
    dict.put('8', "tuv");
    dict.put('9', "wxyz");
    Queue<String> queue = new LinkedList<String>();
    // 先往队列中加入一个空字符串,以便和digits的第一个字符进行拼接
    queue.offer("");
    // 遍历数字字符串,
    for (char c : digits.toCharArray()) {
        // 当前数字对应的字母列表
        String words = dict.get(c);
        // 计算队列长度
        int n = queue.size();
        for (int i = 0; i < n; i++) {
            // 每次从队列取出一个元素,并和当前words中每一个字母进行拼接
            String cur = queue.poll();
            for (int j = 0; j < words.length(); j++) {
                queue.offer(cur + words.charAt(j));
            }
        }
    }
    res.addAll(queue);
    return res;
}

注:dict也可以用字符串数组来表示