求两个字符串a,b中的最长公共子串

题目描述

查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。 

输入例子:
abcdefghijklmnop
abcsafjklmnopqrstuvw
输出例子:
jklmnop

【一解】

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;

  4. string lcs(string str1, string str2)
  5. {
  6.     int len1 = str1.size();
  7.     int len2 = str2.size();
  8.   
  9.     string big  = len1>len2 ? str1:str2;
  10.     string small= len1>len2 ? str2:str1;
  11.  
  12.     int len = small.size();
  13.   
  14.    for(int i=len; i>=1; i--)
  15.     {
  16.        for(int j=0; j<=len-i; j++)
  17.         {
  18.             string sub = small.substr(j,i);

  19.              if(big.find(sub) != -1)
  20.                  return sub;
  21.         }
  22.     }
  23.   return 0;
  1. }
  2. int  main()
  3. {
  4.     string s1,s2;
  5.     while(cin>>s1)
  6.     {  
  7.        cin>>s2;
  8.        cout<<lcs(s1,s2)<<endl;
  9.      }
  10.   return 0;
  11. }

【二解】

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.     string str1, str2;
  8.     while(cin>>str1>>str2)
  9.     {  
  10.        string str;
  11.        if(str1.length() > str2.length())
  12.        {
  13.             str = str2;
  14.            str2 = str1;
  15.            str1 = str;
  16.        }
  17.        int i=0, j=0, num=0; 
  18.        string temp;
  19.        for(i=0; i<str1.length(); i++)
  20.          for(j=1; j<str1.length()-i; j++)
  21.          {
  22.             str=str1.substr(i,j);                                 //从第i个字母开始,连续j个字符
  23.             if(str2.find(str) != str2.npos && num<str.length())
  24.              {
  25.                    num = str.length();
  26.                    temp = str;
  27.              }
  28.          }
  29.       cout<<temp<<endl;
  30.    }
  31. return 0;
  32. }

****************相关************

求最长公共子串的长度

输入: asdfas werasdfaswer

输出:6

【代码】

  • #include<iostream>
  • #include<string>
  • using namespace std;
  •  
  • int main()
  • {
  •     string str1, str2;
  •     while(cin>>str1>>str2)
  •     {  
  •        string str;
  •        if(str1.length() > str2.length())
  •        {
  •             str = str2;
  •            str2 = str1;
  •            str1 = str;
  •        }
  •        
  •        int i=0, j=0;
  •        set<int> s;
  •        for(int i=0; i<str1.length(); i++)
  •          for(int j=1; j<str1.length()-i; j++)
  •          {
  •             str=str1.substr(i,j);                                 //从第i个字母开始,连续j个字符
  •             if(str2.find(str) != str2.npos)
  •              {
  •                    s.insert(j);
  •              }
  •          }
  •       cout<<s.size()<<endl;     
  •    }
  • return 0;
  • }



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

屠变恶龙之人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值