问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-22 13:42

我来回答

2个回答

热心网友 时间:2022-04-22 15:12

算法:求两个字符串的最长公共子串

原理:

(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);  

       } 

热心网友 时间:2022-04-22 16:30

试试看:假设两个字符串最长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菜鸟还是先去好好学习基础,这个题目对你来说太难了。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果手机微信怎么换漂亮字体(苹果手机微信怎么换行输入) 有什么好用的app转换字体 手写转文字的软件 erp可以看评论地址吗 淘宝评论url是什么意思? 揭秘:码牌支付风控升级,背后真相揭秘 电脑电视直播软件哪个好用什么软件好电脑看电视直播 潼南子同街学区是哪些 三极管BU406价格和参数? 火锅料放在冰柜忘了插电一个星期给会坏了吗 火锅的设备有哪些 聊天时怎么转换话题才能显得不生硬 热水壶内胆破裂是什么样 用英语聊天时,如何转换话题 和女人聊天时,怎么转换话题? 如何调动聊天话题 和女友聊天怎么找话题和换话题? 游戏内置语音用不了什么原因 别说ctrl设置什 聊天,怎么学会,切换话题 游戏语音都包括哪些 我的电脑内存是3gb,由于做的是xp32位系统,4gb内存识别不出来,我以为想问用6gb内存玩全面 如何自然地切换聊天话题? 游戏开发中用什么内置语音好 U盘3GB的内存容量是否等于电脑的3GB内存容量,请高手指点? 电脑8gb内存3gb可用 游戏内置语音不能说话咋回事 3GB内存+32GB闪存是什么意思? 开发游戏用什么内置语音好呢 游戏里的内置语音怎么开启 一个电脑,内存用3GB电脑会不会卡,影响大不大 4GB内存,可用内存3GB是什么意思? 聊天换话题不知道说什么怎么办也不知道该聊什么好 贵州茅台集团白金1819多少钱一瓶 茅台1918酒多少钱一瓶 白金酒1819价格 暖水壶内胆碎了玻璃渣子崩裤子上了,怎么去除 全国各地特色的面食都有什么啊? 1819红酒多少钱一瓶? 三亚机场最新离港政策? 茅台1819是啥酒? 陕西省白水杜康酒多少钱 我有一瓶L.DORVILLE的酒,上面有xo标志,还有ESTD 1819的标志,请问在多少钱价位? 红酒1819价格会过期吗? 有什么特色面食 “Dear John”的词语来历是什么? 三亚市红塘湾新机场建成后,凤凰机场还起降飞机吗 杜康酒价格 高分 ”分手信“用英文怎么说 为什么三亚到哈尔滨的飞机不采用大型客机A380? 马克水印相机的考勤工具好用吗? 今日水印相机可以再iPad上同步吗?