返回

从电话号码中提取字母组合

见解分享

概述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回, 给出数字到字母的映射与电话按键相同 时间复杂度:O(3^m *4^n),其中 m 是输入中对应 3 个字母的数字个数,n 是输入中对应 4 个字母的数字个数,m+n是输入数字的总个数。

算法

  1. 创建一个映射表,将数字映射到相应的字母。
  2. 创建一个递归函数,该函数将一个数字字符串作为输入,并返回该字符串的所有可能的字母组合。
  3. 在递归函数中,将数字字符串分解成更小的子字符串。
  4. 使用映射表,将每个子字符串映射到相应的字母。
  5. 将所有可能的字母组合连接起来,并返回结果。

代码实现

def letter_combinations(digits):
    """
    :type digits: str
    :rtype: List[str]
    """
    # 创建映射表
    mapping = {
        '2': 'abc',
        '3': 'def',
        '4': 'ghi',
        '5': 'jkl',
        '6': 'mno',
        '7': 'pqrs',
        '8': 'tuv',
        '9': 'wxyz'
    }

    # 创建递归函数
    def backtrack(index, combination):
        # 如果已经到达字符串的末尾,则返回结果
        if index == len(digits):
            return [combination]

        # 获取当前数字对应的字母
        letters = mapping[digits[index]]

        # 递归地生成所有可能的字母组合
        result = []
        for letter in letters:
            result.extend(backtrack(index + 1, combination + letter))

        return result

    # 调用递归函数,并返回结果
    return backtrack(0, "")

算法分析

  • 时间复杂度:O(3^m *4^n),其中 m 是输入中对应 3 个字母的数字个数,n 是输入中对应 4 个字母的数字个数,m+n是输入数字的总个数。
  • 空间复杂度:O(m + n),其中 m 是输入中对应 3 个字母的数字个数,n 是输入中对应 4 个字母的数字个数,m+n是输入数字的总个数。

结论

本文介绍了如何从一个仅包含数字 2-9 的字符串中提取所有它能表示的字母组合。算法使用递归的方法,将问题分解成更小的子问题,并使用映射来将数字映射到相应的字母。这种算法的时间复杂度为 O(3^m *4^n),其中 m 是输入中对应 3 个字母的数字个数,n 是输入中对应 4 个字母的数字个数,m+n是输入数字的总个数。