最长公共子序列Lcs

浅浅的花香味﹌ 2022-06-12 10:55 295阅读 0赞

1.给出两个字符串A B,求A与B的最长公共子序列的长度(子序列不要求是连续的)。

2.给出两个字符串A B,求A与B的最长公共子序列子串(子序列不要求是连续的)。

比如两个串为:

abcicba

abdkscab

ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。

最大长度为4,一个是求长度,一个是要求最长子串

Input

第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)

Output

输出最长的子序列,如果有多个,随意输出1个。

Sample Input

  1. abcicba
  2. abdkscab

Sample Output

  1. abca
  2. 求长度图解过程:
  3. 循环过程图解如下:
  4. 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 2 2 2 2 2 2 0 1 2 3 3 3 3 3 0 1 2 3 3 4 4 4 0 1 2 3 4 4 4 4 0 1 2 3 4 4 5 5
  5. #include <cstdio>
  6. #include <cstring>
  7. #define MAXLen 1000
  8. char seq1[MAXLen];
  9. char seq2[MAXLen];
  10. int maxLen[MAXLen][MAXLen];
  11. int main()
  12. {
  13. while(scanf("%s%s",seq1+1,seq2+1))
  14. {
  15. int length1=strlen(seq1+1);
  16. int length2=strlen(seq2+1);
  17. for(int i=0; i<=length1; i++)
  18. maxLen[i][0]=0;
  19. for(int j=0; j<=length2; j++)
  20. maxLen[0][j]=0;
  21. for(int i=1; i<=length1; i++)
  22. {
  23. for(int j=1; j<=length2; j++)
  24. {
  25. if(seq1[i]==seq2[j])
  26. maxLen[i][j]=maxLen[i-1][j-1]+1;
  27. else
  28. maxLen[i][j]=maxLen[i-1][j]>maxLen[i][j-1]?maxLen[i-1][j]:maxLen[i][j-1];
  29. }
  30. }
  31. printf("%d\n",maxLen[length1][length2]);
  32. }
  33. return 0;
  34. }
  35. 求子串: #include<cstdio>
  36. #include<cstring>
  37. #include<algorithm>
  38. using namespace std;
  39. char str1[1005],str2[1005];
  40. int d[1005][1005];
  41. int main()
  42. {
  43. while(gets(str1)&&gets(str2))
  44. {
  45. int len1=strlen(str1),len2=strlen(str2);
  46. memset(d,0,sizeof(d));
  47. for(int i=len1-1; i>=0; i--)
  48. for(int j=len2-1; j>=0; j--)
  49. {
  50. if(str1[i]==str2[j])
  51. d[i][j]=d[i+1][j+1]+1;
  52. else
  53. d[i][j]=max(d[i+1][j],d[i][j+1]);
  54. }
  55. //printf("%d\n",d[0][0]);
  56. int i = 0, j = 0;
  57. while (i < len1 && j < len2){
  58. if (str1[i] == str2[j]){
  59. printf("%c",str1[i]);
  60. i++;
  61. j++;
  62. }
  63. else if (d[i+1][j] >= d[i][j+1])
  64. i++;
  65. else
  66. j++;
  67. }
  68. printf("\n");
  69. }
  70. return 0;
  71. }

发表评论

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

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

相关阅读

    相关 公共序列LCS问题

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

    相关 LCS 公共序列

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