最长公共子序列-C++/C

一时失言乱红尘 2024-04-18 19:12 108阅读 0赞
  1. 文件main.c
  2. #include <iostream>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include "LCSLLength.h"
  6. using namespace std;
  7. int main(){
  8. char * x="ABCBDAB";
  9. char * y="BDCABA";
  10. LCSLLength L1(y,x);
  11. cout<<"L1.getLength() = "<<L1.getLength()<<endl;
  12. char *res=L1.getLCS();
  13. printf("\n%s\n",res);
  14. cout<<"\nhello world!!\n";
  15. return 0;
  16. }
  17. 文件.h
  18. #ifndef LCSLLENGTH_H
  19. #define LCSLLENGTH_H
  20. #include <iostream>
  21. using namespace std;
  22. class LCSLLength
  23. {
  24. public:
  25. LCSLLength(char * x, char * y);
  26. virtual ~LCSLLength();
  27. int getLength();
  28. char* getLCS();
  29. protected:
  30. private:
  31. char *x;
  32. char *y;
  33. int size_x=0;
  34. int size_y=0;
  35. int flag[500][500];
  36. };
  37. #endif // LCSLLENGTH_H

文件.cpp

  1. #include "LCSLLength.h"
  2. #include "stdio.h"
  3. #include "stdlib.h"
  4. LCSLLength::LCSLLength(char *x , char *y)
  5. {
  6. this->x = x;
  7. this->y = y;
  8. printf("%s\n",this->x);
  9. printf("%s\n",this->y);
  10. while(this->x[size_x]!='\0'){
  11. size_x++;
  12. }
  13. while(this->y[size_y]!='\0'){
  14. size_y++;
  15. }
  16. cout<<"x="<<size_x<<" and y="<<size_y<<endl;
  17. }
  18. LCSLLength::~LCSLLength()
  19. {
  20. //dtor
  21. }
  22. //返回最长公共子序列长度, x,y
  23. int LCSLLength::getLength(){
  24. printf("%s\n",x);
  25. printf("%s\n",y);
  26. int array[size_x+1][size_y+1]={0}; //保存标记
  27. int data[size_x+1][size_y+1]={0}; //保存长度
  28. for(int i=0; i<=size_x; i++){
  29. for(int j=0; j<=size_y; j++){
  30. if(i==0 || j==0){
  31. data[i][j]=0;
  32. array[i][j]=0;
  33. }
  34. else if(x[i-1] == y[j-1]){
  35. // cout<<data[i-1][j-1]<<endl;
  36. data[i][j]=data[i-1][j-1]+1;
  37. array[i][j]=1;
  38. }
  39. else if(data[i-1][j] >= data[i][j-1]){
  40. data[i][j]=data[i-1][j];
  41. array[i][j]=3;
  42. }
  43. else{
  44. data[i][j]=data[i][j-1];
  45. array[i][j]=2;
  46. }
  47. }
  48. }
  49. cout<<"数组data"<<endl;
  50. for(int i=0; i<=size_x; i++){
  51. for(int j=0; j<=size_y; j++){
  52. cout<<data[i][j]<<" ";
  53. flag[i][j] = array[i][j];
  54. }
  55. cout<<endl;
  56. }
  57. cout<<"数组array"<<endl;
  58. for(int i=0; i<=size_x; i++){
  59. for(int j=0; j<=size_y; j++){
  60. cout<<array[i][j]<<" ";
  61. }
  62. cout<<endl;
  63. }
  64. return data[size_x][size_y];
  65. }
  66. char* LCSLLength::getLCS()
  67. {
  68. char res[500];
  69. int i = size_x;
  70. int j = size_y;
  71. int k = 0; ///用于保存结果的数组标志位
  72. while (i>0 && j>0)
  73. {
  74. if (flag[i][j] == 1) ///如果是对角线标记
  75. {
  76. res[k] = x[i - 1];
  77. k++;
  78. i--;
  79. j--;
  80. }
  81. else if (flag[i][j] == 2) ///如果是向左标记
  82. {
  83. j--;
  84. }
  85. else if (flag[i][j] == 3) ///如果是向上标记
  86. {
  87. i--;
  88. }
  89. }
  90. printf("ok\n");
  91. char result[size_x+size_y];
  92. int a=0;
  93. for (i = k - 1; i >= 0; i--){
  94. result[a++]=res[i];
  95. printf("%c", res[i]);
  96. } result[a]='\0';
  97. return result;
  98. }

发表评论

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

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

相关阅读

    相关 公共序列

    最长公共子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列

    相关 公共序列

    一个序列的子序列是该序列中删除某些元素后得到的序列。给定两个子序列X和Y,求二者的最长公共子序列。 例如,X=\{A,B,C,B,D,A,B\},Y=\{B,D,C,A,B,

    相关 公共序列

    最长公共子序列 最长公共子序列与最长公共子串的区别在于最长公共子序列不要求在原字符串中是连续的,比如ADE和ABCDE的最长公共子序列是ADE。 我们用动态规划的方法来思考