最长公共子串
'''
最长公共子串
dp问题
dp[i][j]表示str1[:i]与str2[:j]最长公共子串的长度
'''
def LCS_s(str1,str2):#返回最长公共子串长度
m=len(str1)
n=len(str2)
dp=[[0]*(n+1) for i in range(m+1)]
max_len=0
for i in range(1,m+1):
for j in range(1,n+1):
if str1[i-1]==str2[j-1]:
#如果当前对应位置相等,则最长公共子串长度+1 否则,当前的dp[i][j]=0 因为不是公共子串了
dp[i][j]=dp[i-1][j-1]+1
max_len = max(max_len, dp[i][j])
return max_len
最长公共子序列
'''
最长公共子序列
dp问题
dp[i][j]表示str1[:i]与str2[:j]最长公共子序列的长度
'''
def LCS_XL(str1,str2):#返回最长公共子序列长度
m=len(str1)
n=len(str2)
dp=[[0]*(n+1) for i in range(m+1)]
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
else:
dp[i][j]=max(dp[i][j-1], dp[i-1][j])
return dp[n][m]