17. LetterCombinationsOfAPhoneNumber

这题是典型的递归,不过用迭代也可以做。
迭代的思路是,
第一层for每次读入一个digits里的数字,解析成String,比如从1得到"abc"。
第二层for,依次读取结果集result里面已有的array们。
第三层for,依次读取"abc"里面的"a""b""c",跟第二层里面的结果集里的一一匹配。
最后,更新结果集。

    public ArrayList letterCombinations(String digits) {
        ArrayList result = new ArrayList<>();
        if(digits.length()==0) return result;
        result.add("");
        int digitLen = digits.length();
        for(int i = 0 ; i < digitLen ; i ++){
            String letter = getLetters(digits.charAt(i));
            ArrayList newResult  = new ArrayList<>();
            for(int j = 0 ; j < result.size() ; j++ ){
                for(int k = 0 ; k < letter.length() ; k ++){
                    newResult.add(result.get(j) + letter.charAt(k));
                }
            }
            result = newResult;
        }
        return result;
    }

    private String getLetters(char digit) {
        switch (digit) {
            case '2':
                return "abc";
            case '3':
                return "def";
            case '4':
                return "ghi";
            case '5':
                return "jkl";
            case '6':
                return "mno";
            case '7':
                return "pqrs";
            case '8':
                return "tuv";
            case '9':
                return "wxyz";
            case '0':
                return "";
            default:
                return "";
        }
    }

递归的思路:
https://segmentfault.com/a/1190000003766442

public class Solution {

    String[] table = {" ", " ", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};


    public List letterCombinations(String digits) {
        // 建立映射表
        ArrayList result = new ArrayList<>();
        StringBuilder sb = new StringBuilder();
        dfs(result, sb, digits, 0);
        return result;
    }

    public void dfs(ArrayList result, StringBuilder sb, String digits, int tableIndex) {
        if (tableIndex == digits.length()) {
            result.add(sb.toString());
            return;
        }
        //digits: "23"
        //注意这一句,tableIndex每次递归后增加;而for中i增加的是当前letter的index,也就是说输入"12"会以ad,ae,af..顺序打印
        String letter = table[digits.charAt(tableIndex) - '0'];
        //letter.length() not  digits.length()
        for (int i = 0; i < letter.length(); i++) {
            sb.append(letter.charAt(i));
            dfs(result, sb, digits, tableIndex + 1);
            //永远是len-1
            sb.deleteCharAt(sb.length() - 1);
        }
    }

    public static void main(String args[]) {
        Solution solution = new Solution();
        System.out.println(solution.letterCombinations("23"));
    }
}

你可能感兴趣的:(17. LetterCombinationsOfAPhoneNumber)