LCS 最长公共子序列

绝地灬酷狼 2022-08-03 14:57 258阅读 0赞

首先要明白什么是子序列,什么是子串;

设:主串长度为n;

子序列:从主串中抽出少于n的元素组成的序列(这些抽出的元素比一定是连续的他们的相对位置不变);

  1. 例:主串为abdexk
  2. 那么在子序列中若有a,则a必须在所有其他元素的前面,若有b,除了ab排在最前面............(相对位置不变)

子串:从主串中抽出少于n的元素组成的序列(这写被抽出来的元素必须是连续的,相对位置不变);

  1. 例:主串为afoijnc
  2. 那么在子串中,若有ai,则子串中必有一段时afoi,不会出现afiaoiai的的情况。

最长公共子序列的求法网上有很多,这里不多做解释,直接上模板了。

(目前为止只知道这一个)

  1. #define maxx(a,b) (a>b?a:b)
  2. char s1[1200],s2[1200];
  3. int p[1200][1200];
  4. void LCS(){
  5. int len1=strlen(s1);
  6. int len2=strlen(s2);
  7. int i,j;
  8. for(i=1;i<=len1;i++){
  9. for(j=1;j<=len2;j++){
  10. if(s1[i-1]==s2[j-1])
  11. p[i][j]=p[i-1][j-1]+1;
  12. else
  13. p[i][j]=maxx(p[i-1][j],p[i][j-1]);
  14. }
  15. }
  16. }

以上这种会超内存,下面给出优化版

  1. #define maxx(a,b) (a>b?a:b)
  2. char s1[1200],s2[1200];
  3. int p[2][1200];
  4. void LCS(){
  5. int len1=strlen(s1);
  6. int len2=strlen(s2);
  7. int i,j;
  8. for(i=1;i<=len1;i++){
  9. for(j=1;j<=len2;j++){
  10. int x=i%2; //滚动数组
  11. int y=1-x;
  12. if(s1[i-1]==s2[j-1])
  13. p[x][j]=p[y][j-1]+1;
  14. else
  15. p[x][j]=maxx(p[y][j],p[x][j-1]);
  16. }
  17. }
  18. }

发表评论

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

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

相关阅读

    相关 公共序列LCS问题

    好久没有写博客了,刚才在网上看了清华大学的数据结构公开课,链接:https://www.xuetangx.com 可以注册个账号去听数据结构课程,老师讲的特好。 我的代码是按

    相关 LCS 公共序列

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