LeetCode.17.电话号码的字母组合(中等)

题目描述:

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母

输入输出实例:

思路:这是一个全组合的问题,我们可以使用回溯法进行求解(如果给出的是空,我们也返回空列表,这个情况我们单独考虑一下),我们先把数字和字母的映射表构建出来(即构建一个字典)。然后定义一个递归函数backfind,输入参数是下标(用来从字典里面找字符串)和一个子列表(方便我们将每个小字符串添加到答案列表中)。在递归函数里遍历当前数字的所有可能字母,通过递归调用 backtrack 函数处理下一个数字。我们返回的列表里面的每一个字符串的长度都是和digits一样的,所以当我们子列表的长度和digits一样的时候,当前的子列表里面的内容就是答案列表的元素之一,我们就可以return到上一级了。根据上述思路我们可以有以下代码:
解法一:

class Solution:

    def letterCombinations(self, digits: str) -> List[str]:

        nums_map = {'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno','7':'pqrs',

                    '8':'tuv','9':'wxyz'}

        if not digits :

            return []

       

        def backfind(index,path):

            if index == len(digits):

                ans.append(''.join(path))

                return

            current = nums_map[digits[index]]

            for i in current:

                path.append(i)

                backfind(index+1,path)

                path.pop() #字符串添加到ans之后我们就把这个path的这个最后一个字符删去(比如实例一,我们把ae放到答案列表后,删除e,接着循环3的字符,把f放到子列表,子列表就变成了af)
 

        ans = []

        backfind(0,[])

        return ans

解法二:

还有一个相对来说更简单的方法,python中有product函数专门用来处理计算所有字母列表的笛卡尔积,即所有可能的组合

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        nums_map = {'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno','7':'pqrs',
                    '8':'tuv','9':'wxyz'}
        if not digits :
            return []
        
        group = [nums_map[digit] for digit in digits]
        ans = [''.join(ans1) for ans1 in product(*group)]        
        return ans

两种解法都可以通过实例

 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值