当前位置:   article > 正文

动态规划-最长公共子序列(c语言)_最长公共子序列问题c语言

最长公共子序列问题c语言

实验3:最长公共子序列

内容:给定两个字符串str1和str2,输出两个字符串的最长公共子序列,如果最长公共子序列为空,则返回“-1”。目前给出的数据,仅仅会存在一个最长的公共子序列。

数据范围:0≤|str1|,|str2|≤2000

要求:空间复杂度O(n2

具体思路:

step1:dp[i][j]的含义是,以str1中的第i个字符,str2中的第j个字符结尾的最长子序列长度
step2:转移方程,对于dp[i][j]来说,
如果str1[i-1]与str2[j-1]相等,那么dp[i][j]=dp[i-1][j-1]+1,
如果不等,dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
step3:获取公共子序列,从dp数组的最后一个位置开始遍历,如果每次比较当前位置与其左、上、左上的关系,然后将符合要求的字符加入栈中,符合要求即来自dp表格左上方的字符。然后将栈中的字符拼接即可得到最长公共子序列,注意检查子序列是否为空

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define MAX 50
  4. char str1[MAX];
  5. char str2[MAX];//两个字符串
  6. int n1,n2;//计字符串长度
  7. int dp[MAX][MAX];
  8. char s[MAX];//存最长序列
  9. int count;//存最长序列的长度
  10. void view();
  11. void LCS();
  12. int max(int a,int b);
  13. int main()
  14. {
  15. printf("请输入两个字符串\n");
  16. scanf("%s %s",&str1,&str2);
  17. n1=strlen(str1);
  18. n2=strlen(str2);
  19. LCS();
  20. view();
  21. printf("第一个字符串:%s\n第二个字符串:%s\n",str1,str2);
  22. printf("长度:%d\n",dp[n1][n2]);
  23. printf("最长子序列:%s\n",s);
  24. return 0;
  25. }
  26. int max(int a,int b)
  27. {
  28. return a>b?a:b;
  29. }
  30. void LCS()
  31. {
  32. //初始化dp数组
  33. for(int i=0;i<=n1;i++)
  34. {
  35. dp[i][0]=0;
  36. }
  37. for(int j=0;j<=n2;j++)
  38. {
  39. dp[0][j]=0;
  40. }
  41. //LCS
  42. //dp[i][j]=dp[i-1][j-1] (str1[i-1]==str2[j-1])
  43. //dp[i][j]=max(dp[i-1][j],dp[i][j-1]) (str1[i-1]!=str2[j-1])
  44. //dp[i][j] 分别是以str1第i个字符结尾,str2第j个字符结尾的最长序列长度
  45. // 0 1 2
  46. //例:char[] a b c
  47. //dp 0 1 2 3......其中0被初始化了
  48. for(int i=1;i<=n1;i++)
  49. {
  50. for(int j=1;j<=n2;j++)
  51. {
  52. if(str1[i-1]==str2[j-1])
  53. dp[i][j]=dp[i-1][j-1]+1;
  54. else
  55. dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
  56. }
  57. }
  58. }
  59. //看是哪些序列
  60. void view()
  61. {
  62. int i=n1,j=n2;//倒着看
  63. count=dp[n1][n2]-1;//序列长度-1
  64. while(count>=0)
  65. {
  66. if(dp[i][j]==dp[i-1][j-1])
  67. {
  68. s[count]=str1[i-1];
  69. count--;
  70. i--,j--;
  71. }
  72. else if(dp[i][j]==dp[i][j-1])
  73. {
  74. j--;
  75. }
  76. else//dp[i][j]==dp[i-1][j]
  77. {
  78. i--;
  79. }
  80. }
  81. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/35290
推荐阅读
相关标签
  

闽ICP备14008679号