ACwing897-最长公共子序列
最长公共子序列
链接:https://www.acwing.com/problem/content/898/
来源:ACWing 算法基础课
题目描述
给定两个长度分别为 N 和 M 的字符串 A 和 B,求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。
输入格式
第一行包含两个整数 N 和 M。
第二行包含一个长度为 N 的字符串,表示字符串 A。
第三行包含一个长度为 M 的字符串,表示字符串 B。
字符串均由小写字母构成。
输出格式
输出一个整数,表示最大长度。
数据范围
1≤N,M≤1000
输入样例:
1 | 4 5 |
输出样例:
1 | 3 |
算法描述
状态表示
本题使用二维数组dp来分别描述a,b两个char数组,在相应长度下的最长公共字符长度。
集合划分
以b[j]为结尾基准,可以这么理解——在i长度下,与b[j]的最大公共长度。
- 让dp[i] [j]=dp[i-1] [j],应为i长度下肯定能包含i-1长度下的最大公共值
- 判断更新dp[i] [j] = max(dp[i] [j-1],dp[i-1] [j]),因为在前面的1~j更新范围时,dp[i] [j-1]的值很有可能发生变化
- 进行了前面的两步操作,当a[i] = b[j]时,我们就可以让dp[i] [j]直接与dp[i-1] [j-1]+1进行比较,因为后者是直接还没有a[i]和b[j]的状态下获得的长度,找到了一样的加一,但由于底二步的的更新,则需要对两者进行比较。
- 在上述过程进行完成之后,我么就得到了最长公共子序列的值了
笔者代码
1 | import java.util.Scanner; |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 随意!
评论
ValineDisqus




