博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode#17 Letter Combinations of a Phone Number
阅读量:4645 次
发布时间:2019-06-09

本文共 2766 字,大约阅读时间需要 9 分钟。

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=res16 return cmb

 

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

1     # @param {string} digits2     # @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+c16 backTrack(kvmap, tmpStr, index+1, digits, res)

 

 

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

 

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

你可能感兴趣的文章
ubuntu如何安装svn客户端?
查看>>
arcgis for javascript (3.17)
查看>>
AI之路,第二篇:python数学知识2
查看>>
[LintCode] 空格替换
查看>>
JSSDK微信支付封装的支付类方法,代码比较齐全,适合收藏
查看>>
mfc Radio Buttons
查看>>
86. Partition List
查看>>
[LintCode] 378 Convert Binary Search Tree to Doubly Linked List 解题报告
查看>>
3.9 java基础总结集合①LIst②Set③Map④泛型⑤Collections
查看>>
Unix和Linux下C语言学习指南
查看>>
css3圈圈进度条
查看>>
Python 函数动态参数
查看>>
javascript之非构造函数的继承
查看>>
C#实现 单点登录(SSO)
查看>>
高精度计算(2015.8.1)
查看>>
cocos2d-x tile map瓦片地图的黑线及地图抖动解决方案
查看>>
软工网络15团队作业2——团队计划
查看>>
Android屏幕适配
查看>>
ps简单操作文档
查看>>
CSS之float样式
查看>>