LeetCode 电话号码的字母组合

题目:

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

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

示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
思路:

对于给定的数字字符串,遍历串中每一个元素,取出该元素对应的字母与其他元素对应的字母进行组合,得到我们想要的输出结果。这里我是讲这些过程看成是一次次的递归运算,将元素依次两两运算,得到的结果与下一元素进行运算。具体的,如输入‘234’,先将['a','b','c']与['d','e','f']运算得到['ad', 'ae', 'af', 'bd', 'be', 'bf', 'cd', 'ce', 'cf'],然后将结果与['g','h','i']进行下一次运算。对于每一次运算,遍历前一个元素对应的每个字母,将这些字母与另一个元素对应的字母进行组合。示例如下:

def combin(self,x):
    return lambda y:x+y
map(combin('a',['d','e','f']))

>>>['ad','ae','af']

完整的代码如下:

class Solution(object):
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        if (digits.isdigit()==False):             #检查输入是否是数字
            return []
        for i in range(len(digits)):              #检查输入数字是否有非2-9
            temp=int(digits[i])
            if (temp<2):
                return []
        num2=['a','b','c']                        #将每个数字对应的字母保存在一起
        num3=['d','e','f']
        num4=['g','h','i']
        num5=['j','k','l']
        num6=['m','n','o']
        num7=['p','q','r','s']
        num8=['t','u','v']
        num9=['w','x','y','z']
        result=[]
        for indx,num in enumerate(digits):        #遍历digits中每一个数字
            if indx==0:                           #对于第一个数字
                exec('result=num%d'%int(num))     #将result初始化为第一个数字对应的字母
            else:                                 #一般情况下
                exec('result=self.f(result,num%d)'%int(num))    #依次将每两个数字对应字母进行计算,得到的结果与下一个数字进行计算。
        return result
                     
    def add(self,x):                              #将字母x与字母y进行拼接
        return lambda y:x+y
    
    def f(self,x,y):                              #循环拼接输入的两个list, x=['a','b'] y=['c','d'] -> ['ac','ad','bc','bd']
        result=[]
        for i in x:                               #遍历x中每个元素
            result+=map(self.add(i),y)            #将这个元素与y中每个元素进行拼接,最后将结果累加存到result中
        return result

关于exec使用部分参考之前的文章 循环定义多个变量 ,add函数和map组合使用部分考虑单独开一篇文章解释。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值