每日一题 电话号码的字母组合

给定一个只包含2-9的数字字符串,根据电话按键的映射关系,返回所有可能的字母组合。文章提供了两种解法,一种使用队列进行广度优先搜索,另一种采用递归方法。示例展示了不同输入下的输出结果。

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"]

解答(队列)

class Solution(object):
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        #不存在返回空
        if not digits:
            return []
        #建立数组
        d = [" ","*","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]
        #数组中加入一个空字符
        res = [""]
        for i in digits:
            length = len(res)
            letters = d[ord(i)-48] #遍历字符,查找字典中对应的字符串
            for _ in xrange(length):
                tmp = res.pop(0) #取出队列中的第一个元素
                for j in letters:
                    res.append(tmp+j) #分别跟后一位字符拼接,放回队列
        return res

例如,23

a        b        c

b        c        ad        ae        af

c        ad        ae        af        bd        be        bf

ad        ae        af        bd        be        bf        cd        ce        cf

解答(递归)

class Solution(object):
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        #不存在返回空
        if not digits:
            return []
        #建立List
        d = [" ","*","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]
        res = []
        #递归函数
        def dfs(tmp,index):
            #index标记遍历字符串的位置
            if index==len(digits):
                res.append(tmp) #tmp相当于a b c以及后面分别加上d e f
                return
            x = digits[index]
            #查找字典 ord(x)-48就是获取x的ascll码减去0
            letters = d[ord(x)-48]
            #遍历字符串,例如2对应的就是abc
            for i in letters:
                dfs(tmp+i,index+1)
        dfs("",0)
        return res

例如,23

            2

  a        b        c

  3        3        3

def     def      def

经过树状结构最后得到,ad ae af bd be bf cd ce cf

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值