码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode#17 Letter Combinations of a Phone Number

时间:2015-07-30 16:24:09      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

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     # @param {string} digits
 2     # @return {string[]}
 3     def letterCombinations(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 
 9         res=[]
10         backTrack(dic, [], 0, digits, res)
11         return [‘‘.join(localStr) for localStr in res]
12         
13 
14     def backTrack(self, kvmap, localStr, index, digits, res):
15         if index==len(digits):
16             res.append(localStr[:])
17         else:
18             for c in kvmap[digits[index]]:
19                 localStr.append(c)
20                 backTrack(kvmap, localStr, index+1, digits, res)
21                 localStr.pop()

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

注意line16的写法,不能写成

res.append(localStr)

因为这样append进去的是一个叫做localStr的标签,而不是localStr里的字符内容。

 

LeetCode#17 Letter Combinations of a Phone Number

标签:

原文地址:http://www.cnblogs.com/acetseng/p/4689342.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!