文章目录
- Question
- Ideas
- Code
Question
给定两个长度分别为 N 和 M 的字符串 A 和 B,求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。
输入格式
第一行包含两个整数 N 和 M。
第二行包含一个长度为 N 的字符串,表示字符串 A。
第三行包含一个长度为 M 的字符串,表示字符串 B。
字符串均由小写字母构成。
输出格式
输出一个整数,表示最大长度。
数据范围
1≤N,M≤1000
输入样例:
4 5
acbd
abedc
输出样例:
3
Ideas
线性DP
Code
a,b = list(map(int,input().strip().split()))
s1 = '0' + input().strip()
s2 = '0' + input().strip()
N = 1010
M = 1010
f = [[0 for i in range(N)] for i in range(N)] # f[i,j]代表在s1前i个位置中出现且在s2前j个位置中出现的所有子序列长度的最大值
# 关于初始化 因为当i为0或者j的时候,所有的子序列长度均为0 ,定义的时候默认如此,无需初始化
for i in range(1,a+1):
for j in range(1,b+1):
f[i][j] = max(f[i-1][j],f[i-1][j-1],f[i][j-1])
if s1[i] == s2[j]:
f[i][j] = max(f[i][j],f[i-1][j-1]+1)
print(f[a][b])