返回

力扣选讲: 模拟法与dfs算法剖析「整数/罗马数字互转」「最长公共前缀」「电话号码的字母组合」

前端

在本文中,我们将对LeetCode的三道经典算法题——「整数/罗马数字互转」「最长公共前缀」「电话号码的字母组合」——进行深入剖析。这些题目均涉及模拟法和深度优先搜索(DFS)算法,是我们理解基本算法思想和灵活应用编码技巧的重要步骤。我们不仅会对问题进行详细解释,还会提供清晰简洁的代码示例。

整数/罗马数字互转:

给定一个整数,将其转换为罗马数字。题目要求严格遵循罗马数字的表达规则。模拟法是解决此题的常用方法。

def int_to_roman(num):
    roman_symbols = {
        1000: 'M',
        900: 'CM',
        500: 'D',
        400: 'CD',
        100: 'C',
        90: 'XC',
        50: 'L',
        40: 'XL',
        10: 'X',
        9: 'IX',
        5: 'V',
        4: 'IV',
        1: 'I'
    }
    roman_number = ''
    for value, symbol in roman_symbols.items():
        while num >= value:
            num -= value
            roman_number += symbol
    return roman_number

# 示例:
result = int_to_roman(1990)
print(result)  # MCMXC

最长公共前缀:

给定一组字符串,找出它们最长的公共前缀。需要将所有字符串中的公共前缀提取出来。DFS算法是常用的解决方案。

def longest_common_prefix(strs):
    if not strs:
        return ""
    shortest_str = min(strs, key=len)

    for i, char in enumerate(shortest_str):
        for other_str in strs:
            if other_str[i] != char:
                return shortest_str[:i]
    return shortest_str

# 示例:
strs = ["flower", "flow", "flight"]
result = longest_common_prefix(strs)
print(result)  # "fl"

电话号码的字母组合:

给定一个电话号码,找出所有可能的字母组合。题目要求穷尽所有可能的字母组合。深度优先搜索算法是解决此题的常用方法。

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

    # 电话按键与字母对应关系表
    phone_mapping = {
        "2": "abc",
        "3": "def",
        "4": "ghi",
        "5": "jkl",
        "6": "mno",
        "7": "pqrs",
        "8": "tuv",
        "9": "wxyz",
    }

    def dfs(index, current_combination):
        if index == len(digits):
            combinations.append(current_combination)
            return

        for letter in phone_mapping[digits[index]]:
            dfs(index + 1, current_combination + letter)

    combinations = []
    dfs(0, "")
    return combinations

# 示例:
digits = "23"
result = letter_combinations(digits)
print(result)  # ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]

通过这些题目的讲解,我们对模拟法和DFS算法有了一个更深入的了解。这仅仅是我们算法学习之旅的开始,在未来的文章中,我们将继续探索更多有趣的算法问题。