48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
|
# -*- coding: utf-8 -*-
|
|||
|
# @Time : 2024/4/13 13:23
|
|||
|
# @Author : len
|
|||
|
# @File : 最长公共子串.py
|
|||
|
# @Software: PyCharm
|
|||
|
# @Comment :
|
|||
|
|
|||
|
def longest_common_substring(strs):
|
|||
|
if not strs:
|
|||
|
return ""
|
|||
|
|
|||
|
# 定义一个函数来寻找两个字符串的最长公共子串
|
|||
|
def lcs(s1, s2):
|
|||
|
n, m = len(s1), len(s2)
|
|||
|
# 初始化动态规划表
|
|||
|
dp = [[0] * (m + 1) for _ in range(n + 1)]
|
|||
|
longest, x_longest = 0, 0 # 存储最长公共子串的长度和结束位置
|
|||
|
for i in range(1, n + 1):
|
|||
|
for j in range(1, m + 1):
|
|||
|
if s1[i - 1] == s2[j - 1]: # 当字符相同
|
|||
|
dp[i][j] = dp[i - 1][j - 1] + 1
|
|||
|
if dp[i][j] > longest: # 更新最长公共子串的信息
|
|||
|
longest = dp[i][j]
|
|||
|
x_longest = i
|
|||
|
else:
|
|||
|
dp[i][j] = 0 # 字符不同,公共子串长度重置为0
|
|||
|
return s1[x_longest - longest: x_longest] # 返回最长公共子串
|
|||
|
|
|||
|
# 从列表中的第一个字符串开始,逐步与后续字符串比较
|
|||
|
common_sub = strs[0]
|
|||
|
for s in strs[1:]:
|
|||
|
common_sub = lcs(common_sub, s)
|
|||
|
if not common_sub: # 如果公共子串长度为0,提前终止
|
|||
|
break
|
|||
|
|
|||
|
return common_sub
|
|||
|
|
|||
|
# 输入的字符串列表
|
|||
|
strings = [
|
|||
|
"a1b2c3d4e5",
|
|||
|
"a2b2c3d4e4",
|
|||
|
"a3b3c3d4e6",
|
|||
|
"a5b2c3d4e5"
|
|||
|
]
|
|||
|
|
|||
|
# 调用函数,找出最长的公共子串
|
|||
|
result = longest_common_substring(strings)
|
|||
|
print(result)
|