給定一個包含 2 到 9 之間數字的字串,傳回該數字可以表示的所有可能的字母組合。以任意順序回傳答案。
下圖為數字對字母的映射(就像電話按鈕一樣)。請注意數字 1 不映射到任何字母。
Input: digits = "23"
Output: ["ad","ae","af","bd","be","bf","cd","ce","cf"]
Input: digits = ""
Output: []
Input: digits = "2"
Output: ["a","b","c"]
思路
詳細步驟
實現 (Python)
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
# 數字到字母的映射
phone_map = {
"2": "abc", "3": "def", "4": "ghi", "5": "jkl",
"6": "mno", "7": "pqrs", "8": "tuv", "9": "wxyz"
}
# 如果輸入為空,返回空列表
if not digits:
return []
# 回溯函數
def backtrack(index, path):
# 如果字母組合完成,加入結果
if index == len(digits):
combinations.append("".join(path))
return
# 獲取當前數字對應的字母
possible_letters = phone_map[digits[index]]
for letter in possible_letters:
# 選擇字母,進一步遞歸
path.append(letter)
backtrack(index + 1, path)
# 回溯:移除剛剛加入的字母
path.pop()
# 結果列表
combinations = []
backtrack(0, [])
return combinations
時間與空間複雜度
思路
詳細步驟
實現 (Python)
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
# 數字到字母的映射
phone_map = {
"2": "abc", "3": "def", "4": "ghi", "5": "jkl",
"6": "mno", "7": "pqrs", "8": "tuv", "9": "wxyz"
}
# 如果輸入為空,返回空列表
if not digits:
return []
# 初始化隊列
queue = deque([""])
for digit in digits:
for _ in range(len(queue)):
combination = queue.popleft()
for letter in phone_map[digit]:
queue.append(combination + letter)
return list(queue)
時間與空間複雜度
這題適合初學者熟悉回溯法的核心概念與應用,也可以幫助理解如何用迭代法替代遞歸方法來解決問題。