返回

LeetCode初阶算法系列——递归与电话号码字母组合

前端

各位看官老爷们,大家好!今天咱要和大家分享的,是LeetCode算法初阶系列里的第17道题——电话号码的字母组合。话不多说,咱这就开始整!

题目分析

给定一个数字字符串,每个数字对应一个或多个字母。要求找出这个字符串的所有字母组合。

解法一:递归

递归,是一种非常基础的算法思想。它的核心思想是,一个问题可以分解为多个相同或相似的子问题,然后递归地求解这些子问题,最终得到原问题的解。

针对本题,我们可以将一个数字字符串分解为两个子问题:

  • 第一个子问题:求出第一个数字对应的所有字母组合。
  • 第二个子问题:求出剩下的数字字符串对应的所有字母组合。

然后,我们就可以用第一个子问题的解和第二个子问题的解进行组合,得到原问题的解。

使用递归解题,代码如下:

def letterCombinations(digits):
    if not digits:
        return []

    phone_map = {
        '2': 'abc',
        '3': 'def',
        '4': 'ghi',
        '5': 'jkl',
        '6': 'mno',
        '7': 'pqrs',
        '8': 'tuv',
        '9': 'wxyz'
    }

    def backtrack(index, path):
        if index == len(digits):
            result.append(path)
            return

        for letter in phone_map[digits[index]]:
            backtrack(index + 1, path + letter)

    result = []
    backtrack(0, "")
    return result

解法二:迭代

除了递归之外,我们还可以使用迭代的方式来解决这个问题。

首先,我们需要创建一个列表,用来存储每个数字对应的字母。然后,我们就可以遍历这个列表,并不断将新字母添加到当前的组合中。

使用迭代解题,代码如下:

def letterCombinations(digits):
    if not digits:
        return []

    phone_map = {
        '2': 'abc',
        '3': 'def',
        '4': 'ghi',
        '5': 'jkl',
        '6': 'mno',
        '7': 'pqrs',
        '8': 'tuv',
        '9': 'wxyz'
    }

    combinations = [""]
    for digit in digits:
        temp = []
        for combination in combinations:
            for letter in phone_map[digit]:
                temp.append(combination + letter)
        combinations = temp

    return combinations

结语

以上就是LeetCode第17题“电话号码的字母组合”的两种解法。这道题难度不大,但它很好地体现了递归和迭代这两种算法思想。希望大家通过本文的讲解,能够对这两者有更深入的理解。