Skip to content

Latest commit

 

History

History
79 lines (58 loc) · 2.17 KB

LeetCode-17.Letter Combinations of a Phone Number.md

File metadata and controls

79 lines (58 loc) · 2.17 KB

LeetCode - 17. Letter Combination of a Phone Number

https://leetcode.com/problems/letter-combinations-of-a-phone-number/

题目

1555053287232

解析

比较明显的搜索题目。可以用dfs和bfs。

DFS的思路:

  • 递归函数需要一个当前状态的字符串的值,记为curr
  • 还需要一个当前字符串的长度,我们搜索到l == dights.length就可以了;
  • 然后记得在搜索完之后要回溯,删除当前append的字符;

图:

1555054067126

dfs代码:

class Solution {
    
    private List<String> res;
    private String[] ds = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

    public List<String> letterCombinations(String digits) {
        res = new ArrayList<>();
        if (digits == null || digits.length() == 0) return res;
        dfs(0, digits.toCharArray(), new StringBuilder());
        return res;
    }

    private void dfs(int p, char[] digits, StringBuilder curr) {
        if(p == digits.length){
            res.add(curr.toString());
            return;
        }
        for(char c : ds[digits[p] - '0'].toCharArray()){
            curr.append(c);
            dfs(p + 1, digits, curr);
            curr.deleteCharAt(curr.length() - 1);
        }
    }
}

bfs代码:

就是在前一个状态res的基础上append当前字符串的所有字符,就得到下一个状态。

class Solution {

    public List<String> letterCombinations(String digits) {
        List<String> res = new ArrayList<>();
        if (digits == null || digits.length() == 0) return res;
        String[] ds = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        res.add("");
        for (char c : digits.toCharArray()) {
            List<String> tmp = new ArrayList<>();
            for (String s : res) { //在原有的基础上 + 当前ds[c - '0']的所有字符
                for (char c2 : ds[c - '0'].toCharArray())
                    tmp.add(s + c2);
            }
            res = tmp;
        }
        return res;
    }
}