[leetcode] 17. Letter Combinations of a Phone Number @ python

原题

https://leetcode.com/problems/letter-combinations-of-a-phone-number/

解法1

递归, base case是当只有一位数字时, 返回对应的列表
Time: O(n)
Space: O(n)

class Solution:
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        d = dict(zip('23456789', ['abc','def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']))
        if len(digits) == 0:
            return []
        if len(digits) == 1:
            return list(d[digits[0]])
        prev = self.letterCombinations(digits[:-1])
        last = list(d[digits[-1]])
        ans = [s+c for s in prev for c in last]
        return ans

解法2

DFS + backtracking. 回溯的条件是当i == len(digits), 说明我们已经遍历完整个字符串了, 此时将path加到结果中.

代码

class Solution(object):
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        def dfs(digits, i, path, res):
            # backtracking condition
            if i == len(digits):
                res.append(path)
                return
            for char in d[digits[i]]:
                dfs(digits, i+1, path+char, res)                
                          
        if not digits: return []    
        d = {'2':'abc', '3':'def', '4':'ghi', '5':'jkl', '6':'mno', '7':'pqrs', '8':'tuv', '9':'wxyz'}
        res = []
        dfs(digits, 0, '', res)
        return res

解法3

BFS

代码

class Solution(object):
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """                     
        # base case                
        if not digits: return []    
        d = {'2':'abc', '3':'def', '4':'ghi', '5':'jkl', '6':'mno', '7':'pqrs', '8':'tuv', '9':'wxyz'}
        res = ['']
        for digit in digits:
            string = d[digit]
            new_res = []
            for char in string:
                for path in res:
                    new_res.append(path+char)
            res = new_res   
            
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值