python菜鸟leecode刷题,有关字符组合问题

给观众大佬业们上题目:

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

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

示例 1:

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

示例 2:

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

示例 3:

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

思路:这时候,大佬业会怎么拆分这个问题呢?

让小菜鸟我,来露一手吧。

首先,菜鸟我直接将对应的字符存进列表中:

num_list=[['a','b','c'],['d','e','f'],['g','h','i'],['j','k','l'],['m','n','o'],['p','q','r','s'],['t','u','v'],['w','x','y','z']]
        

PS:当然你想用字典存储也可以,其他只要能存都可以喽~ ( > * n * < )~

然后,先得把digits(字符)进行分解为相应的数字吧,但是分解的前提是,你还要对digits的长度进行分类:

(1) 当digits长度为0时,可以直接进行输出为空“[ ]”

(2) 当digits长度为1时,可以直接直接将对应的(int)digits,But  要注意这里的索引值和对应题目给的对应的值之间相差2,因此 index=(int)digits-2

既然找到对应的索引值了,我们只要将num_list[index]进行返回即可

(3)当digits长度为2时,这里便涉及到不仅要分解对应的digits,还要进行将找到的两个index下的字符内容进行组合。

我图个方便和简单,因此直接用嵌套的循环直接实现。

代码如下:

class Solution(object):  
    def letterCombinations(self, digits):  
        num_list = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['j', 'k', 'l'], ['m', 'n', 'o'], ['p', 'q', 'r', 's'], ['t', 'u', 'v'], ['w', 'x', 'y', 'z']]  
        # 先分解 digits,利用 list comprehension,转成整数并存储在列表中。  
        numbers = [int(i) for i in digits]  
        Ch_list = []  
        x = len(numbers)  
        if x == 0:  
            pass  
        elif x == 1:  
            a = numbers[0]-2  
            Ch_list = num_list[a]  
        elif x == 2:
            a=numbers[0]-2
            b=numbers[1]-2  
            for i in range(len(num_list[a])):
                for j in range(len(num_list[b])):
                    Ch_list.append(num_list[a][i]+num_list[b][j])  
        return Ch_list  
  
if __name__ == "__main__":  
    digits = "23"  
    solution = Solution()  
    result = solution.letterCombinations(digits)  
    print(result)

对于两个以内的数字组合,是可以的。但是对于三个以上的话再用循环的方法会超时,因此,我呢就看了看,官方给的解,代码如下:

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

作者:力扣官方题解
链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/solutions/388738/dian-hua-hao-ma-de-zi-mu-zu-he-by-leetcode-solutio/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

参考官方给的解:

“方法一:回溯
首先使用哈希表存储每个数字对应的所有可能的字母,然后进行回溯操作。

回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是不完整的)。该字符串初始为空。每次取电话号码的一位数字,从哈希表中获得该数字对应的所有可能的字母,并将其中的一个字母插入到已有的字母排列后面,然后继续处理电话号码的后一位数字,直到处理完电话号码中的所有数字,即得到一个完整的字母排列。然后进行回退操作,遍历其余的字母排列。

回溯算法用于寻找所有的可行解,如果发现一个解不可行,则会舍弃不可行的解。在这道题中,由于每个数字对应的每个字母都可能进入字母组合,因此不存在不可行的解,直接穷举所有的解即可。”

很好的一道题,使我认清我自己,真的菜鸟中的战斗机,菜鸟之王。

哈哈哈哈哈哈哈哈哈哈,魔怔了》》》》

诸位,等我前去参悟一下回溯和哈希表。

我只是一只初出茅庐的菜鸟,我菜我要练,我菜又咋滴。

?  <  ………………   ^……………………  "''  > ?

因此,这道题对菜鸟我来说还是挑战挺大的 \(` ^ `)/,害!

做题正如如修仙打怪,你且坚持潜行吧。

吾劝吾即吾劝君。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值