最长公共子串
问题
对于两个字符串,请设计一个时间复杂度为 O(m*n) 的算法(这里的m和n为两串的长度),求出两串的最长公共子串的长度。这里的最长公共子串的定义为两个序列U1,U2,..Un
和V1,V2,...Vn
,其中Ui + 1 == Ui+1,Vi + 1 == Vi+1,同时Ui == Vi。
给定两个字符串A和B,同时给定两串的长度n和m。
测试样例:
"1AB2345CD",9,"12345EF",7
返回:4
思路和实现
三种方法:
1. 动态规划(时间复杂度 = O(n^2),空间复杂度 = O(n^2))
2. 动态规划(时间复杂度 = O(n^2),空间复杂度 = O(n))
3. 动态规划(时间复杂度 = O(n^2),空间复杂度 = O(1))
1. 动态规划(时间复杂度 = O(n^2),空间复杂度 = O(n^2))
采用动态规划,相当于构建一张 n * m 大小的表,表中第 i 行,第 j 列代表以字符串 A[i] 和 B[j] 为结束的子串的最长公共子串长度。那么状态转移方程为:
if i == 0 || j == 0:
dp[i][j] = A[i] == B[j] ? 1 : 0
else
dp[i][j] = A[i] == B