这是典型的字符串动态规划问题。设 str1 长度为 n,str2 长度为 m,我们用最长公共后缀的思想做 动态规划(DP):
定义:dp[j] 表示在当前处理到 str1 的第 i 个字符、str2 的第 j 个字符时(均为下标从 1 开始),两者以这两个位置结尾的最长公共子串长度。
转移:
str1[i-1] == str2[j-1],则 dp[j] = dp[j-1] + 1;dp[j] = 0(以当前两个位置结尾的公共子串被中断)。为了做到空间复杂度 O(m),我们用一维滚动数组并让 j 从右往左遍历,这样 dp[j-1] 仍是上一行(上一轮 i-1)的值。
给定两个字符串 str1 和 str2 ,输出两个字符串的最长公共子串题目保证 str1 和 str2 的最长公共子串存在且唯一。
数据范围:1≤∣strl∣,∣str2∣<5000
要求:空间复杂度 O(n),时间复杂度 O(n∗m)
输入
"1AB2345CD","12345EF"
输出
"2345"