給定數字字串(2-9),返回所有可能的字母組合。數字到字母映射同電話鍵盤。例如 "23" → ["ad","ae","af","bd","be","bf","cd","ce","cf"]。
維護當前組合 path,索引 idx。若 idx == digits.length() 加入結果。否則遍歷當前數字對應的所有字母,加入 path 遞歸,回溯移除。
class Solution {
private static final String[] MAP = {
"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"
};
public List letterCombinations(String digits) {
List res = new ArrayList<>();
if (digits == null || digits.isEmpty()) return res;
backtrack(digits, 0, new StringBuilder(), res);
return res;
}
private void backtrack(String digits, int idx, StringBuilder path, List res) {
if (idx == digits.length()) {
res.add(path.toString());
return;
}
String letters = MAP[digits.charAt(idx) - '0'];
for (char c : letters.toCharArray()) {
path.append(c);
backtrack(digits, idx+1, path, res);
path.deleteCharAt(path.length()-1);
}
}
}
public List letterCombinations(String digits) {
List res = new ArrayList<>();
if (digits.isEmpty()) return res;
res.add("");
for (char d : digits.toCharArray()) {
List tmp = new ArrayList<>();
for (String s : res) {
for (char c : MAP[d-'0'].toCharArray()) {
tmp.add(s + c);
}
}
res = tmp;
}
return res;
}
時間 O(4^n * n)(最多 4 字母),空間 O(4^n * n) 存儲結果。遞歸棧深度 O(n)。