【力扣算法15】之 17. 电话号码的字母组合 python

简介: 【力扣算法15】之 17. 电话号码的字母组合 python

问题描述

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

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

示例1

输入:digits = “23”

输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]

示例2

输入:digits = “”

输出:[]

示例 3

输入:digits = “2”

输出:[“a”,“b”,“c”]

提示

  • 0 <= digits.length <= 4
  • digits[i] 是范围 [‘2’, ‘9’] 的一个数字。

思路分析

这个问题可以使用回溯法来解决。回溯法是一种通过遍历所有可能的解空间来解决问题的方法。在本问题中,我们需要生成给定数字能表示的所有字母组合,因此可以使用回溯法来生成这些组合。

思路如下:

  1. 创建一个字典 digitMap,将每个数字与对应的字母列表进行映射。例如,数字 '2' 对应的字母列表为 ['a', 'b', 'c']
  2. 定义一个递归函数 generateCombos,该函数接收两个参数:当前数字索引 index 和部分结果字符串 combo
  3. generateCombos 函数中,首先判断当前数字索引是否超出了字符串的长度。如果超出了,则将部分结果添加到最终结果列表中,并返回。
  4. 获取当前数字对应的字母列表,并遍历字母列表。对于每个字母,将其添加到部分结果字符串中,并递归调用 generateCombos 函数,同时将当前数字索引加1。
  5. 在回溯过程中,记得要将添加的字母从部分结果字符串中移除,以确保下一次遍历开始时是一个干净的状态。
  6. 如果输入的字符串为空,则直接返回空列表。

这个问题的时间复杂度是 O(3^N * 4^M),其中 N 是输入字符串中对应 3 个字母的数字的个数(如 ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘8’),M 是输入字符串中对应 4 个字母的数字的个数(如 ‘7’, ‘9’)。空间复杂度是 O(N+M)。


代码分析


代码中的回溯法实现主要由两部分组成:letterCombinations 函数和 generateCombos 递归函数。

letterCombinations 函数中,我们首先创建了一个 digitMap 字典,用于存储数字与字母列表的映射关系。然后,我们定义了 generateCombos 递归函数,该函数负责生成所有可能的字母组合。

generateCombos 递归函数中,我们首先判断当前数字索引是否超出了字符串长度,如果是,则将部分结果添加到最终结果列表中,并返回。这里的递归终止条件即为当前数字索引等于字符串长度。

接下来,我们获取当前数字对应的字母列表,并遍历字母列表。对于每个字母,我们将其添加到部分结果字符串中,并递归调用 generateCombos 函数,同时将当前数字索引加1。这样,通过不断地添加字母并递归调用函数,直到达到递归终止条件,就可以生成所有可能的字母组合。

需要注意的是,在每次递归调用结束后,我们要将添加的字母从部分结果字符串中移除,以确保下一次遍历开始时是一个干净的状态,这个过程就是回溯的关键所在。

最后,在 letterCombinations 函数中,我们判断输入的字符串是否为空,如果不为空,就调用 generateCombos 函数来生成所有可能的字母组合。最终,我们返回结果列表。

由于题目中规定输入只包含数字 ‘2’ 到 ‘9’,因此我们事先创建了一个 digitMap 字典来存储数字与字母列表的映射关系。这样做的好处是可以减少重复计算,提高代码的执行效率。

通过回溯法,我们可以生成所有可能的字母组合,解决了给定数字能表示的所有字母组合的问题。


完整代码


class Solution(object):
    def letterCombinations(self, digits):
        # 创建数字与字母列表的映射关系
        digitMap = {
            '2': ['a', 'b', 'c'],
            '3': ['d', 'e', 'f'],
            '4': ['g', 'h', 'i'],
            '5': ['j', 'k', 'l'],
            '6': ['m', 'n', 'o'],
            '7': ['p', 'q', 'r', 's'],
            '8': ['t', 'u', 'v'],
            '9': ['w', 'x', 'y', 'z']
        }
        # 定义递归函数生成所有可能的字母组合
        def generateCombos(index, combo):
            if index == len(digits):  # 当前数字索引超出字符串长度,递归结束条件
                result.append(combo)  # 将部分结果添加到最终结果列表中
                return
            letters = digitMap[digits[index]]  # 获取当前数字对应的字母列表
            for letter in letters:
                generateCombos(index + 1, combo + letter)  # 递归调用,拼接字母并更新数字索引
        result = []  # 存储最终结果的列表
        if digits:
            generateCombos(0, '')  # 如果输入字符串不为空,则从索引 0 开始生成字母组合
        return result  # 返回最终结果列表

详细分析

首先是定义一个 Solution 类:

class Solution(object):
• 1

这段代码定义了一个名为 Solution 的类。

接下来是 letterCombinations 方法的实现:

def letterCombinations(self, digits):
        digitMap = {
            '2': ['a', 'b', 'c'],
            '3': ['d', 'e', 'f'],
            '4': ['g', 'h', 'i'],
            '5': ['j', 'k', 'l'],
            '6': ['m', 'n', 'o'],
            '7': ['p', 'q', 'r', 's'],
            '8': ['t', 'u', 'v'],
            '9': ['w', 'x', 'y', 'z']
        }

letterCombinations 方法中,我们首先创建了一个名为 digitMap 的字典,用于存储数字与字母列表的映射关系。

接下来定义了内部函数 generateCombos

def generateCombos(index, combo):
            if index == len(digits):
                result.append(combo)
                return
            letters = digitMap[digits[index]]
            for letter in letters:
                generateCombos(index + 1, combo + letter)

generateCombos 方法中,首先判断当前数字索引是否等于字符串长度,如果相等,说明已经遍历完了所有数字,将组合结果 combo 添加到结果列表 result 中,并返回。

根据当前数字索引从 digitMap 中获取对应的字母列表,存储在变量 letters 中。

通过一个循环遍历 letters 中的每个字母 letter,并递归调用 generateCombos 方法,传入下一个数字的索引 index + 1 和新的组合结果 combo + letter

letterCombinations 方法中继续实现:

result = []
        if digits:
            generateCombos(0, '')
        return result

这段代码首先创建了一个空列表 result,用于存储最终的组合结果。

然后,判断输入的 digits 字符串是否为空。如果不为空,说明有输入数字,就调用内部函数 generateCombos,传入初始数字索引为0和空字符串 '',开始递归地生成所有可能的字母组合。

最后,返回最终的组合结果列表 result


运行效果截图


调用示例


solution = Solution()
digits1 = "23"
digits2 = ""
digits3 = "2"
print(solution.letterCombinations(digits1))
print(solution.letterCombinations(digits2))
print(solution.letterCombinations(digits3))

运行结果


完结


相关文章
|
7天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
30 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
7天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
23 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
7天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
38 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
12天前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
11天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
28 2
|
20天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
21 3
|
23天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
67 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
27天前
|
存储 Python
[oeasy]python038_ range函数_大小写字母的起止范围_start_stop
本文介绍了Python中`range`函数的使用方法及其在生成大小写字母序号范围时的应用。通过示例展示了如何利用`range`和`for`循环输出指定范围内的数字,重点讲解了小写和大写字母对应的ASCII码值范围,并解释了`range`函数的参数(start, stop)以及为何不包括stop值的原因。最后,文章留下了关于为何`range`不包含stop值的问题,留待下一次讨论。
19 1
|
6天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
6天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!