描述
给出两个字符串,找到最长公共子串,并返回其长度。
子串的字符应该连续的出现在原字符串中,这与子序列有所不同。
您在真实的面试中是否遇到过这个题? 是
样例
给出A=“ABCD”,B=“CBCE”,返回 2
挑战
O(n x m) time and memory.
这一题和上一题几乎一样,上一题见:https://blog.csdn.net/wenqiwenqi123/article/details/81334062
当然要做两处修改:
仍然是设A数组长m,B数组长n,则:
dp数组为m*n,dp[i][j]代表A数组前i个数和B数组前j个数的最长子序列长度
这里是第一处不同,递推式改变了,当两者数字不同的时候dp变为0:
dp[i][j]=dp[i-1][j-1]+1 if A[i]==B[j] and i>0 and j>0
dp[i][j]= 0 if A[i]!=B[j] and i>0 and j>0
第二个不同是在初始化第一行和第一列的时候,不再把相等数字之后的所有数全设为1.
具体看代码:
class Solution:
"""
@param A: A string
@param B: A string
@return: The length of longest common subsequence of A and B
"""
def longestCommonSubstring(self, A, B):
# write your code here
m, n = len(A), len(B)
if(m==0 or n==0): return 0
# dp数组为m*n,dp[i][j]代表A数组前i个数和B数组前j个数的最长子序列长度
dp=[[0 for i in range(n)] for j in range(m)]
# 初始化第一行和第一列
maxp=0
for i in range(m):
if(A[i]==B[0] ):
dp[i][0]=1
maxp = 1
for i in range(n):
if(B[i]==A[0]):
dp[0][i]=1
maxp = 1
# 开始递推
for i in range(1,m):
for j in range(1,n):
if(A[i]==B[j]):
dp[i][j]=dp[i-1][j-1]+1
else:
dp[i][j]=0
maxp=max(dp[i][j],maxp)
return maxp
s = Solution()
print(s.longestCommonSubstring([1,2,3,4],[1,2,3]))