编写一个能计算最大公共子串长度的小程序。 最大公共子串长度就是: 求两个串的所有子串中能够匹配上的最大长度是多少。 比如:"abcdkkk" 和 "baabcdadabc", 可以找到的最长的公共子串是"abcd",所以最大公共子串长度为 4。
时间: 2024-11-29 21:17:54 浏览: 18
在Python中,可以使用动态规划的方法来求解这个问题。我们可以构建一个二维数组,其中 `dp[i][j]` 表示字符串 `str1[:i]` 和 `str2[:j]` 的最长公共子串长度。以下是具体的实现步骤:
```python
def longest_common_substring(str1, str2):
m, n = len(str1), len(str2)
# 初始化一个二维数组,用0表示尚未找到公共子串
dp = [[0] * (n + 1) for _ in range(m + 1)]
# 记录最长公共子串的信息
max_len = 0 # 长度
end_idx = 0 # 结束索引
# 动态规划填充dp数组
for i in range(1, m + 1):
for j in range(1, n + 1):
if str1[i - 1] == str2[j - 1]:
dp[i][j] = dp[i - 1][j - 1] + 1
if dp[i][j] > max_len:
max_len = dp[i][j]
end_idx = i
# 返回最长公共子串
return str1[end_idx - max_len : end_idx]
# 示例
str1 = "abcdkkk"
str2 = "baabcdadabc"
print(longest_common_substring(str1, str2)) # 输出:'abcd'
```
这个函数通过遍历两个输入字符串的每一个字符,当遇到相同的字符时,将上一行和上一列的最长公共子串长度加1。在过程中,如果找到一个新的最长子串,就更新`max_len`和`end_idx`。最终,最长公共子串的长度就在`max_len`,而实际的子串则通过`end_idx`和`max_len`计算得出。
阅读全文