求两个输入的字符串的最长公共子串

如输入asdfgghj和wwrerasiiy,输出as。如果没有公共子串,则输出“没有公共子串”c语言编程... 如输入 asdfgghj和wwrerasiiy,输出as。如果没有公共子串,则输出“没有公共子串”
c语言编程
展开
 我来答
Feeling学院宇
2016-01-21 · TA获得超过6772个赞
知道小有建树答主
回答量:883
采纳率:47%
帮助的人:399万
展开全部
  1. 算法:求两个字符串的最长公共子串

  2. 原理:

(1) 将连个字符串分别以行列组成一个矩阵。

(2)。若该矩阵的节点对应的字符相同,则该节点值为1。

(3)当前字符相同节点的值 = 左上角(d[i-1, j-1])的值 +1,这样当前节点的值就是最大公用子串的长。

       (s2)  b  c    d  e

(s1)

a             0  0    0   0

b             1   0   0   0

c             0    2   0  0

d             0    0   3  0

 

3. 结果:只需以行号和最大值为条件即可截取最大子串

 

C# code:

 

[csharp] view plaincopyprint?

public static string MyLCS(string s1, string s2)  

       {  

           if (String.IsNullOrEmpty(s1) || String.IsNullOrEmpty(s2))  

           {  

               return null;  

           }  

           else if (s1 == s2)  

           {  

               return s1;  

           }  

           int length = 0;  

           int end = 0;  

           int[,] a = new int[s1.Length, s2.Length];  

           for (int i = 0; i < s1.Length; i++)  

           {  

               for (int j = 0; j < s2.Length; j++)  

               {  

                   int n = (i - 1 >= 0 && j - 1 >= 0) ? a[i - 1, j - 1] : 0;  

                   a[i, j] = s1[i] == s2[j] ? 1+n : 0;  

                   if (a[i, j] > length)  

                   {  

                       length = a[i,j];  

                       end = i;  

                   }  

               }  

           }  

           return s1.Substring(end - length + 1, length);  

       } 

濮方雅BX
推荐于2016-05-11 · TA获得超过4042个赞
知道大有可为答主
回答量:2482
采纳率:60%
帮助的人:2460万
展开全部
试试看:假设两个字符串最长1000
#include<iostream>
#include<string.h>
using namespace std;

int c[1000][1000];
char str1[1000];
char str2[1000];


void func(int m,int n){
      if((m<0)||(n<0)) return ;

       for(int i=0;i<m;i++)
         for(int j=0;j<n;j++) c[i][j]=0;

      int besti=0,bestj=0;
      int count=0;

      for(int i=0;i<m;i++)
          for(int j=0;j<n;j++)
              if(str1[i]==str2[j]) {
                  if((i==0)||(j==0)) c[i][j]=1;   //增加判断是否为第一个,第一个不能再向下
                  else  c[i][j]=c[i-1][j-1] + 1 ;
              }
              else c[i][j]=0;

/*
     for(int i=0;i<m;i++){
         for(int j=0;j<n;j++)
             cout<<c[i][j]<<' ';
         cout<<endl;
     }

*/

     for(int i=0;i<m;i++)
         for(int j=0;j<n;j++)
             if(c[i][j]>count) { count=c[i][j]; besti=i; bestj=j; }   //查找最长子字符串

     cout<<count<<endl;
     if(count==0) cout<<"没有公共子串"<<endl;  //公共子字符串长度为1,输出“没有公共子串”
     else
        for(int i=besti-count+1;i<=besti;i++) cout<<str1[i];   //否则输出靠X左边(如果多个)子字符串


}


int main() {
    int m=0;
    int n=0;
    cin>>str1;
    cin>>str2;
    m=strlen(str1);
    n=strlen(str2);
    func(m,n);
    return 0;
}
追问
看不懂啊,像cout<<endl,这是什么意思。func啥意思。我是c菜鸟,才入门.
追答
c++的标准输出语句,
func是自定义函数
c菜鸟还是先去好好学习基础,这个题目对你来说太难了。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式