1. 程式人生 > 其它 >電話號碼的字母組合

電話號碼的字母組合

技術標籤:演算法pythonleetcode資料結構佇列

電話號碼的字母組合

題目

給定一個僅包含數字 2-9 的字串,返回所有它能表示的字母組合。

給出數字到字母的對映如下(與電話按鍵相同)。注意 1 不對應任何字母。

在這裡插入圖片描述
示例:

輸入:“23”
輸出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].

說明:
儘管上面的答案是按字典序排列的,但是你可以任意選擇答案輸出的順序。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number


著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解題思路

回溯

首先想到的是回溯演算法,也就是之前“全排列”題目中接觸到的解法,由於該題所給條件明確,只要出現就不會存在無效情況,於是需要列舉每一種情況,可以把題目的解寫成類似於樹的形式。

學習借鑑 ——佇列

將輸入的 digits 中第一個數字對應的每一個字母入隊,然後將出隊的元素與第二個數字對應的每一個字母組合後入隊,直到遍歷到 digits 的結尾,最後佇列中的元素就是所求結果。

提交程式碼

回溯

class Solution:
    def letterCombinations(self, digits: str
) -> List[str]: if not digits: return [] phone = {'2':['a','b','c'], '3':['d','e','f'], '4':['g','h','i'], '5':['j','k','l'], '6':['m','n','o'], '7':['p','q','r','s'], '8':['t','u'
,'v'], '9':['w','x','y','z']} def backtrack(conbination,nextdigit): if len(nextdigit) == 0: res.append(conbination) else: for letter in phone[nextdigit[0]]: backtrack(conbination + letter,nextdigit[1:]) res = [] backtrack('',digits) return res
  • 時間複雜度:O(3M×4N)
    M 是對應三個字母的數字個數,N 是對應四個字母的數字個數。
  • 空間複雜度:O(3M×4N)
    直接返回最後的結果,列表空間為組合數。

優化空間複雜度

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        if not digits:
            return list()
        
        phoneMap = {
            "2": "abc",
            "3": "def",
            "4": "ghi",
            "5": "jkl",
            "6": "mno",
            "7": "pqrs",
            "8": "tuv",
            "9": "wxyz",
        }

        def backtrack(index: int):
            if index == len(digits):
                combinations.append("".join(combination))
            else:
                digit = digits[index]
                for letter in phoneMap[digit]:
                    combination.append(letter)
                    backtrack(index + 1)
                    combination.pop()

        combination = list()
        combinations = list()
        backtrack(0)
        return combinations

  • 空間複雜度:O(m+n)
    其中 m 是輸入中對應 3 個字母的數字個數,n 是對應 4 個字母的數字個數,m+n 是輸入數字的總個數。
    除了返回值以外,空間複雜度主要取決於雜湊表以及回溯過程中的遞迴呼叫層數,雜湊表的大小為常數,遞迴呼叫層數最大為 m+n。

佇列

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        if not digits: return []
        phone = ['abc','def','ghi','jkl','mno','pqrs','tuv','wxyz']
        queue = ['']  # 初始化佇列
        for digit in digits:
            for _ in range(len(queue)):
                tmp = queue.pop(0)
                for letter in phone[ord(digit)-50]:# 使用ASCII碼定位
                    queue.append(tmp + letter)
        return queue

學習總結

  1. 回溯演算法
    呼叫遞迴,在理解上還不是很到位,耗時較長;
  2. 佇列
    將題目所給資訊用另一種方式儲存,利用ASCII碼找到對應的索引,是一種新的思路。