最长公共子序列:给定两个字符串A和B,长度分别为m和n,要求找出它们最长的公共子序列,并返回其长度。
解题思路:定义dp[i][j]为字符串A的第一个字符到第 i 个字符串(A[:i])和字符串B的第一个字符到第 j 个字符(B[:j])的最长公共子序列。状态转移方程为:
Python3代码如下:
class Solution(object):
def LCSeq(self, s1, s2):
if not s1 or not s2:
return 0
m,n = len(s1),len(s2)
dp = [[0]*(n+1) for _ in range(m+1)]
for i in range(1,m+1):
for j in range(1,n+1):
if s1[i-1] == s2[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i-1][j],dp[i][j-1])
return dp[-1][-1]
最长公共子串:给定两个字符串A和B,长度分别为m和n,要求找出它们最长的公共子串,并返回其长度。
解题思路:定义dp[i][j]表示以A中第i个字符结尾的子串和B中第j个字符结尾的子串的的最大公共子串(公共子串实际上指的是这两个子串的所有部分)的长度。状态转移方程为:
Python3代码如下:
class Solution(object):
def LCStr(self, s1, s2):
if not s1 or not s2:
return 0
result = 0
m,n = len(s1),len(s2)
dp = [[0]*(n+1) for _ in range(m+1)]
for i in range(1,m+1):
for j in range(1,n+1):
if s1[i-1] == s2[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
result = max(result,dp[i][j])
return result