LeetCode(17)—— 電話號碼的字母組合
阿新 • • 發佈:2018-12-16
題目描述
給定一個僅包含數字 2-9 的字串,返回所有它能表示的字母組合。
給出數字到字母的對映如下(與電話按鍵相同)。注意 1 不對應任何字母。
示例:
輸入:"23"
輸出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]
說明:
儘管上面的答案是按字典序排列的,但是你可以任意選擇答案輸出的順序。
想法&嘗試
這題我感覺也沒什麼很巧妙的辦法吧,無非就是對求解的字串集合不斷的作笛卡爾積,什麼意思呢?大概解釋一下:
就拿題目示例為栗子,我求“23”的結果,那麼我先求“2”,那麼當前結果就是["a","b","c"]
["a","b","c"]
與剩餘數字串“3”對應的字元列表[“d”,“e”,“f”]做笛卡爾積,於是就得到了["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]
。
就是這樣,無非遞迴一下,注意遞迴的出口
和入口
(也就是邊界條件啦)
class Solution: def __init__(self): self.map = {"2": "abc", "3": "def", "4": "ghi", "5": "jkl", "6": "mno", "7": "pqrs", "8": "tuv", "9": "wxyz"} def letterCombinations(self, digits): """ :type digits: str :rtype: List[str] """ return self.product(digits, []) def product(self, digits, result): if digits == "": return result if not result: result = [ch for ch in self.map[digits[0]]] digits = digits[1:] return self.product(digits, result) newResult = [] for item in result: for ch in self.map[digits[0]]: newResult.append(item + ch) digits = digits[1:] return self.product(digits, newResult)
然後我執行,AC了,可是有點慢,52ms,超過了45%的人,於是我優化了一下,把字典直接變成列表,直接利用數字索引。
class Solution: def __init__(self): self.map = ["abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"] def letterCombinations(self, digits): """ :type digits: str :rtype: List[str] """ # 遞迴 return self.product(digits, []) def product(self, digits, result): """ :param digits: 剩餘未處理的數字串 :param result: 當前處理結果 :return: """ # 如果數字串全部處理完畢,直接返回 if digits == "": return result # 如果當前處理為空,也就是第一次處理,把該數字對應的3/4個字母append if not result: result = [ch for ch in self.map[int(digits[0])-2]] # 處理剩餘數字串 digits = digits[1:] return self.product(digits, result) # 其實就是將已經得到的所有串和當前數字對應的3/4個字母作笛卡爾積 newResult = [] for item in result: for ch in self.map[int(digits[0])-2]: newResult.append(item + ch) digits = digits[1:] return self.product(digits, newResult)
再提交,44ms,超過90%的人。~~