什么是公共子串呢?For example,对于abcdefg与aaabcddefgefg,有多个相同的子序列,例如abcd,defg,efg,那就输出abcd(如果子序列长度相等,输出先出现的)哈哈,很简单吧,那就解决它吧。
时间: 2023-06-12 11:08:23 浏览: 124
面试必考字符串相关的动态规划——最大公共子序列、最大公共子串、编辑距离
公共子串是指两个字符串中同时出现的子串。解决这个问题可以使用动态规划,具体步骤如下:
1. 定义一个二维数组dp,其中dp[i][j]表示以第一个字符串中第i个字符和第二个字符串中第j个字符为结尾的公共子串的最大长度。
2. 初始化dp数组:dp[i][j]=0(当i=0或j=0时)。
3. 如果第一个字符串中第i个字符和第二个字符串中第j个字符相等,那么dp[i][j]=dp[i-1][j-1]+1,否则dp[i][j]=0。
4. 在更新dp数组的过程中,记录最长的公共子串以及它在第一个字符串中的起始位置。
5. 最后输出最长的公共子串即可。
以下是Python代码实现:
```python
def longest_common_substring(str1, str2):
m, n = len(str1), len(str2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
max_len, end = 0, 0
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 = i
else:
dp[i][j] = 0
return str1[end - max_len:end]
```
测试:
```python
>>> str1 = "abcdefg"
>>> str2 = "aaabcddefgefg"
>>> longest_common_substring(str1, str2)
'abcd'
```
阅读全文