最大匹配字符子串 深度优先

来源:互联网 发布:达内 网络培训和 编辑:程序博客网 时间:2024/06/10 08:36

深度优先, 可以得出最大匹配数目, 但是无法输出最大匹配字符子串。

#include "iostream"  #include "cstring"  using namespace std;    #define len 1024  char a[len];  char b[len];  int max, length_a, length_b;    void pull(int now_a, int now_b, int num){      int i, j;      if(now_a == length_a || now_b == length_b){          if(max < num){              max = num;          }          return;      }      for(i = now_a; i < length_a; i++){          for(j = now_b ;j < length_b; j++){              if(a[i] == b[j]){               //相同的选择它                  pull(i + 1, j + 1, num+1);              }              //或者进入下一次循环, 放弃它          }          //a数组中这个字符, 可能没有跟匹配的, 那么进入下一次循环, 下次循环又得从now_b开始      }      if(max < num)          max= num;  }    int main(){      while(cin >> a && strcmp(a, "-1") && cin >> b){//输入-1结束          max = 0;          length_a = strlen(a);          length_b = strlen(b);          pull(0, 0, 0);          cout<<"max= "<<max<<endl;          memset(a, '0', sizeof(a));          memset(b, '1', sizeof(b));      }      return 0;  }  

动态规划,输出公共子串, 程序来自http://blog.csdn.net/yysdsyl/article/details/4226630

#include <stdio.h>#include <string.h>#define MAXLEN 100//x为第一个字符串,y为第二个字符串, m, n分别代表x, y访问位置//用c[i][j]记录X[i]与Y[j] 的LCS 的长度//b[][]void LCSLength(char *x, char *y, int m, int n, int c[][MAXLEN], int b[][MAXLEN]){    int i, j;        for(i = 0; i <= m; i++)        c[i][0] = 0;    for(j = 1; j <= n; j++)        c[0][j] = 0;    for(i = 1; i<= m; i++)    {        for(j = 1; j <= n; j++)        {            if(x[i-1] == y[j-1])//只有这两个相等, 说明这个字符是公共的            {                c[i][j] = c[i-1][j-1] + 1;                b[i][j] = 0;            }            else if(c[i-1][j] >= c[i][j-1])            {                c[i][j] = c[i-1][j];                b[i][j] = 1;            }            else            {                c[i][j] = c[i][j-1];                b[i][j] = -1;            }        }    }}void PrintLCS(int b[][MAXLEN], char *x, int i, int j){    if(i == 0 || j == 0)        return;    if(b[i][j] == 0)//等于0才算是匹配上了    {        PrintLCS(b, x, i-1, j-1);        printf("%c ", x[i-1]);    }    else if(b[i][j] == 1)        PrintLCS(b, x, i-1, j);    else        PrintLCS(b, x, i, j-1);}int main(int argc, char **argv){    char x[MAXLEN] = {"ABCBDAB"};    char y[MAXLEN] = {"BDCABA"};    int b[MAXLEN][MAXLEN];    int c[MAXLEN][MAXLEN];    int m, n;        m = strlen(x);    n = strlen(y);        LCSLength(x, y, m, n, c, b);    PrintLCS(b, x, m, n);        return 0;}


原创粉丝点击