給定一個只包含數字 2-9 的字符串,返回所有可能的字母組合(按電話鍵盤映射)。例如 "23" → ["ad","ae","af","bd","be","bf","cd","ce","cf"]。
2: abc 3: def 4: ghi 5: jkl 6: mno 7: pqrs 8: tuv 9: wxyz
這是經典的組合生成問題,每個數字對應一組候選字母,依次選取並遞歸處理下一位。
index 個數字,已構建的前綴 pathdigits[index] 對應的所有字母index == digits.length,將 path 加入結果class Solution {
vector result;
const vector keypad = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
public:
vector letterCombinations(string digits) {
if (digits.empty()) return result;
dfs(digits, 0, "");
return result;
}
private:
void dfs(const string& digits, int index, string path) {
if (index == digits.size()) {
result.push_back(path);
return;
}
string letters = keypad[digits[index] - '0'];
for (char c : letters) {
dfs(digits, index + 1, path + c); // 傳遞副本,無需顯式回溯
}
}
};
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
if not digits: return []
keypad = ["", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
res = []
def dfs(i, path):
if i == len(digits):
res.append(path)
return
for c in keypad[ord(digits[i]) - ord('0')]:
dfs(i + 1, path + c)
dfs(0, "")
return res
vector 或 string + push_back/pop_back)vectorletterCombinations(string digits) { if (digits.empty()) return {}; vector res = {""}; for (char d : digits) { vector tmp; for (const string& s : res) { for (char c : keypad[d - '0']) { tmp.push_back(s + c); } } res.swap(tmp); } return res; }
電話號碼字母組合是 DFS 回溯的入門級應用。關鍵在於: