LeetCode#17 Letter Combinations of a Phone Number

Problem Definition:

Given a digit string, return all possible letter combinations that the number could represent.

A mapping of digit to letters (just like on the telephone buttons) is given below.

Input:Digit string "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.

 

Solution:

1)遍历。遍历每一个数字,找到它可能指向的字符,把每一个字符与前面已经形成的串拼接。

例如输入数字串为'23'。

    1._数字为'2',可能的串为['a', 'b', 'c']

    2._数字为'3', 对应的字符为['d', 'e', 'f'],分别与1._中形成的所有串拼接,得到:['ad','ae','af',    'bd','be','bf',    'cd','ce','cf'].

 1     # @param {string} digits
 2     # @return {string[]}
 3     def letterCombinations(digits):
 4         if digits=='':
 5             return []
 6         dic={'2':['a','b','c'],'3':['d','e','f'],'4':['g','h','i'],'5':['j','k','l'],
 7              '6':['m','n','o'],'7':['p','q','r','s'],'8':['t','u','v'],'9':['w','x','y','z']}
 8         cmb=['']
 9         for d in digits:
10             chs=dic[d]
11             res=[]
12             for pre in cmb:
13                 for sub in chs:
14                     res+=(pre+sub)
15             cmb=res
16         return cmb

 

2)以上过程用Python实现,可以利用reduce函数:

1     # @param {string} digits
2     # @return {string[]}
3     def letterCombinations(self, digits):
4         if digits=='':
5             return []
6         dic={'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno',
7             '7':'pqrs','8':'tuv','9':'wxyz'}
8         return reduce(lambda X,Y: [pre+sub for pre in X for sub in dic[Y]], digits,[''])

在line 8 reduce函数的形式是:reduce(func, iterable, init) .

init是最开始给X的赋值,如果不指定init, 则X初始值默认是iterable的第一个元素。这里指定了,因此最开始X==[ '' ].

iterable是digits,也就是包含数字符号的字符串。因为指定了初始的X,所以Y的初始值为digits[0]...迭代过程中Y会变成digits[1], digits[2]...

func是一个lambda表达式:lambda X,Y: [pre+sub for pre in X for sub in dic[Y]]。其中包含一个列表推导式。相当于一个函数:

 

1 def func(X, Y):
2     res=[ ]    
3     for pre in X:
4         for sub in dic[Y]:
5             res.append(pre+sub)
6     return res                   

 

在reduce函数中,上一次计算的结果会作为新的X。直到iterable(这里是digits)迭代结束。

 

3)回溯法。把问题的解空间用树的形式组织起来,在这棵虚拟的树上做深度优先遍历(DFS)。

 

 1     def letterCombinations(digits):
 2         if digits=='':
 3             return []
 4         dic={'2':'abc','3':'def','4':'ghi','5':'jkl','6':'mno',
 5             '7':'pqrs','8':'tuv','9':'wxyz'}
 6         res=[]
 7         backTrack(dic, '', 0, digits, res)
 8         return res
 9         
10     def backTrack(kvmap, localStr, index, digits, res):
11         if index==len(digits):
12             res.append(localStr)
13         else:
14             for c in kvmap[digits[index]]:
15                 tmpStr=localStr+c
16                 backTrack(kvmap, tmpStr, index+1, digits, res)

 

 

以上是基于递归的深度优先遍历。backTracking的退出条件是字符串的长度等于数字串的长度。

 

转载于:https://www.cnblogs.com/acetseng/p/4689342.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值