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());
這句在做的事