LCS——最长公共子序列“连续”与“不连续”版本

分手后的思念是犯贱 2022-12-28 14:16 256阅读 0赞

文章目录

  • 最长公共子序列(非连续)
    • 状态转移方程
    • 核心代码
  • 最长公共子序列(连续)
    • 状态转移方程
    • 核心代码

最长公共子序列(非连续)

这一类LCS问题是最常见的。

给定两个字符串a,b,求a,b的最长公共子序列的长度

状态转移方程

1

核心代码

  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. using namespace std;
  5. int LCS_Len(string a, string b)
  6. {
  7. int dp[1000][1000];
  8. for(int i = 1; i <= a.size(); i++)
  9. for(int j = 1; j <= b.size(); j++){
  10. if(a[i - 1] == b[j - 1])
  11. dp[i][j] = dp[i - 1][j - 1] + 1;
  12. else
  13. dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
  14. }
  15. return dp[a.size()][b.size()];
  16. }

最长公共子序列(连续)

给定两个字符串a,b,求a,b的最长公共连续子序列的长度

这里要保证最长公共子序列一定要是连续的

状态转移方程

在这里插入图片描述

最后在dp数组中寻找一次最大值,这个值就是最大长度

核心代码

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string>
  4. using namespace std;
  5. int Similar(string a, string b)
  6. {
  7. int dp[100][100];
  8. for(int i = 1; i <= a.size(); i++){
  9. for(int j = 1; j <= b.size(); j++){
  10. if(a[i - 1] == b[j - 1])
  11. dp[i][j] = dp[i - 1][j - 1] + 1;
  12. else{
  13. dp[i][j] = 0;
  14. }
  15. }
  16. }
  17. int max = -1;
  18. for(int i = 1; i <= a.size(); i++)
  19. for(int j = 1; j <= b.size(); j++)
  20. if(max <= dp[i][j])
  21. max = dp[i][j];
  22. return max;
  23. }

发表评论

表情:
评论列表 (有 0 条评论,256人围观)

还没有评论,来说两句吧...

相关阅读

    相关 连续重复序列

    最长连续不重复子序列 给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。 输入格式 第一行包含整数 n。 第二行包含 n 个整数

    相关 连续重复序列

    题目描述 给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。 输入格式 第一行包含整数 n。 第二行包含 n 个整数(均在 0∼1

    相关 LCS 公共序列

    首先要明白什么是子序列,什么是子串; 设:主串长度为n; 子序列:从主串中抽出少于n的元素组成的序列(这些抽出的元素比一定是连续的他们的相对位置不变);