Letter combination

Given a digit string excluded01, return all possible letter combinations that the number could represent.

A mapping of digit to letters (just like on the telephone buttons) is given below.

就是以前的 3310 輸入時手機顯示的那個功能

想法是每按一個就要跳下一個按鈕,當沒有下一個按鈕就返回上一個按鈕,並做完上一個數字的剩下的字母

例如題目給 “2”,那一開始是 a,然後看有沒有下一個,沒有則返回然後選 b,以此類推

public List<String> letterCombinations(String digits) {

    List<String> results = new ArrayList<String>();
    if (digits.length() == 0) {
        return results;
    }

    Map<Character, char[]> map = new HashMap<Character, char[]>();
    map.put('0', new char[] {});
    map.put('1', new char[] {});
    map.put('2', new char[] { 'a', 'b', 'c' });
    map.put('3', new char[] { 'd', 'e', 'f' });
    map.put('4', new char[] { 'g', 'h', 'i' });
    map.put('5', new char[] { 'j', 'k', 'l' });
    map.put('6', new char[] { 'm', 'n', 'o' });
    map.put('7', new char[] { 'p', 'q', 'r', 's' });
    map.put('8', new char[] { 't', 'u', 'v'});
    map.put('9', new char[] { 'w', 'x', 'y', 'z' });

    StringBuilder str = new StringBuilder();
    helper(map, digits, str, results);
    return results;
}


void helper(Map<Character, char[]> map,
            String digits,
            StringBuilder last,
            List<String> results) {

    if (last.length() == digits.length()) { //這裡可以用digits長度判斷,因為要找出“所有的”所以要找完
        results.add(last.toString());
        return;
    }

    Character key = digits.charAt(last.length());
    for (char c : map.get(key)) {
        last.append(c);
        helper(map, digits, last, results);
        last.deleteCharAt(last.length() -1);
    }
}

一開始我有做對,但後來系統一直報 space 不夠,原因是因為我都用 String 直接傳,

然後再 substring 什麼的,後來查一下,在 java 裡最好是用 StringBuilder 來傳,能節省不少空間

之前的寫法我還用雙迴圈,所以每次都還要傳入現在是哪個 digits,

但其實就是 Character key = digits.charAt(last.length()); 這句在做的事

results matching ""

    No results matching ""