zoukankan      html  css  js  c++  java
  • 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的退出条件是字符串的长度等于数字串的长度。

  • 相关阅读:
    Python 01 Python的安装和配置
    Python 04 Geany的安装和配置
    Python 02 编写代码
    Python 03 pip 的安装和使用
    开源项目 12 ServiceStack.OrmLite
    北京第二天
    exit
    北京第一天
    关于扩展欧几里得算法和逆元
    正妹吃月饼
  • 原文地址:https://www.cnblogs.com/acetseng/p/4689342.html
Copyright © 2011-2022 走看看