题目:
给定一个仅包含数字 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组合使用部分考虑单独开一篇文章解释。