[Leetcode解題] Letter Combinations of a Phone Number - 遞迴解
11 February 2022
medium
recursion
microsoft
題目
17. Letter Combinations of a Phone Number
解題思路
這個題目要求我們給定一個由數字組成的字串,並且根據手機鍵盤上的字母對應關係,找出所有可能的字母組合。
我們使用一個遞迴的方法來實現這個需求。我們會建立一個空的列表存放所有可能的字母組合,和一個空字串作為中間過程的暫存變量。我們會遞迴處理每個數字,每個數字都有3~4種可能的對應字母,我們會枚舉這幾種可能性,並且把當前的字母組合加入到暫存變量中。當我們枚舉完所有數字時,我們就能得到所有可能的字母組合。
我們的程式會檢查我們是否已經枚舉完了所有數字,如果是,則把當前字母組合加入到結果列表中。如果還有剩餘數字,則繼續遞迴處理下一個數字,直到所有可能的組合都被處理完。
最後,函數會回傳包含所有可能字母組合的列表。
實作
def letterCombinations(self, digits: str) -> List[str]:
digit_to_letter = {
"2":'abc',
"3":'def',
"4":'ghi',
"5":'jkl',
"6":'mno',
"7":'pqrs',
"8":'tuv',
"9":'wxyz'
}
def letterComs(letters, digits, tmpstr, tlen):
if len(digits)==0:
return
if len(tmpstr)+1 == len(digits):
for letter in digit_to_letter[digits[tlen]]:
letters.append(tmpstr+letter)
else:
for letter in digit_to_letter[digits[tlen]]:
letterComs(letters, digits, tmpstr+letter, tlen+1)
letters = []
letterComs(letters, digits, "", 0)
return letters
時間複雜度
這個題目的時間複雜度為O(4^n),其中n是輸入字串的長度。
簡單來說,我們需要對於每個數字都花費3~4次的時間來找出所有的字母組合,而我們有n個數字,所以時間複雜度就是4^n。