力扣 电话号码的字母组合

这篇博客探讨了一种将仅包含数字2-9的字符串转换为其对应的字母组合的方法。作者首先展示了自己实现的解决方案,通过数字到字母的映射函数,然后通过乘法操作组合所有可能的字母。接着,博主提到了官方提供的回溯法解决方案,该方法使用字典映射数字到字母并使用回溯策略生成所有组合。文章通过多个示例展示了两种方法的输出,并对比了它们的实现思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

在这里插入图片描述
示例 1:

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

示例 2:

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

示例 3:

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

关于映射,这里本人用的是asll转换并且条件判断,官方给的是直接存储值…

class Solution:
    def numberToLetters(self,n,r=3,c=0):# 数字转换,n为数字,r为数量,c为偏移量
        target = ord(n)
        res = []
        for i in range(r):
            res.append(chr(target + 47 + i + (int(n)-2)*2+c))
        return res
    
    def mapManage(self,n): # 数字映射
        if(int(n)<=6):
            return self.numberToLetters(n)
        elif(n == '7'):
            return self.numberToLetters('7',4,0)
        elif(n == '8'):
            return self.numberToLetters('8',3,1)
        else:
            return self.numberToLetters('9',4,1)

    def multiply(self,a,b):# 进行相乘
        res = []
        for m in a:
            for n in b:
                res.append(m+n)
        return res

    def letterCombinations(self, digits: str) -> List[str]:
        if(digits == ""):return []
        if(len(digits) == 1):return self.mapManage(digits)
        res = []
        
        target = []
        for i in digits:
            target.append(self.mapManage(i))
        
        res = target[0]
        for i in range(1,len(target)):
            res = self.multiply(res,target[i])
        
        return res

官方:
回溯

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        if not digits:
            return list()
        
        phoneMap = {
            "2": "abc",
            "3": "def",
            "4": "ghi",
            "5": "jkl",
            "6": "mno",
            "7": "pqrs",
            "8": "tuv",
            "9": "wxyz",
        }

        def backtrack(index: int):
            if index == len(digits):
                combinations.append("".join(combination))
            else:
                digit = digits[index]
                for letter in phoneMap[digit]:
                    combination.append(letter)
                    backtrack(index + 1)
                    combination.pop()

        combination = list()
        combinations = list()
        backtrack(0)
        return combinations
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值