返回
力扣选讲: 模拟法与dfs算法剖析「整数/罗马数字互转」「最长公共前缀」「电话号码的字母组合」
前端
2023-10-13 06:23:56
在本文中,我们将对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算法有了一个更深入的了解。这仅仅是我们算法学习之旅的开始,在未来的文章中,我们将继续探索更多有趣的算法问题。