问题:给定两个字符串,求它们前后重叠的最长子串的长度,比如”abcde”和“cdefg”是”cde”,长度为3。
输入:
    输入可能包含多个测试案例。
    对于每个测试案例只有一行, 包含两个字符串。字符串长度不超过1000000,仅包含字符’a'-’z'。

输出:
    对应每个测试案例,输出它们前后重叠的最长子串的长度。

样例输入:
    abcde cdefg
样例输出:
    3

回答:典型的KMP算法应用。

方法一:

#include <cstdio>
#include <string>
#include <cstring>
#include <ctime>
#include <cstdlib>
#include <map>
#include <queue>
#include <string>
#include <algorithm>
using namespace std;
typedef long long lld;

const int INF=1000000000;

const int MAX=1000005;
int a[MAX];
int b[MAX];
char S[MAX],T[MAX];
void get_fail(char *S,char *T,int n,int m)
{
       int i,j=0;
       a[0]=m;
       while(1+j<m&&T[j]==T[1+j])j++;
       a[1]=j;
       int k=1;
       int need=0;
       for(i=2;i<m;i++)
       {
              need=k+a[k]-i;
              if(a[i-k]<need)a[i]=a[i-k];
              else
              {
                     j=0>need?0:need;
                     while(i+j<m&&T[j]==T[j+i])j++;
                     a[i]=j;
                     k=i;
              }
       }
       j=0;
       while(j<n&&j<m&&S[j]==T[j])j++;
       b[0]=j;
       k=0;
       for(i=1;i<n;i++)
       {
              need=k+b[k]-i;
              if(a[i-k]<need)b[i]=a[i-k];
              else
              {
                     j=0>need?0:need;
                     while(i+j<n&&j<m&&S[i+j]==T[j])j++;
                     b[i]=j;
                     k=i;
              }
       }
}

int main()
{  
       int n,m;
       int last=0;
       int i,j,k;

while(scanf("%s%s",&S,&T)!=EOF)
       {
              n=strlen(S);
              m=strlen(T);
              get_fail(S,T,n,m);
              int ans=0;
              for(i=0;i<n;i++)
              {
                     if(b[i]==n-i)
                     {
                            ans=b[i];
                            break;
                     }
              }
              printf("%d\n",ans);
       }
    return 0;
}

方法二:

#include"stdio.h"
#include"string.h"
#define M 1000010
int judge(char *s,char *t,int low,int high){
    int index_t = 0;
    int len_t = strlen(t);
    while(low <= high)
    {
        if(s[low] != t[index_t]) return 0;
        ++low;
        ++index_t;
    }
    return 1;
}

int main()
{
    char s[M],t[M];
    int len_s,len_t,i,flag;
    while(~scanf("%s%s",s,t))
    {
        flag = 0;
        len_s = strlen(s);
        len_t = strlen(t);
        i = len_s > len_t ? len_s-len_t : 0;//减少判断,s串短,从0开始判断,s串长,从len_s-len_t位置开始判断。
        for(; i < len_s ;++i)
        {
            if(s[i] == t[0] && judge(s,t,i,len_s -1))
            {
                printf("%d\n",len_s - i);
                flag = 1;
                break;
            }
        }
        if(!flag) printf("0\n");
    }
    return 0;
}

转载于:https://www.cnblogs.com/benchao/p/4516252.html

计算重叠最长子串问题相关推荐

  1. #1407 : 后缀数组二·重复旋律2 (不可重叠最长重复子串问题)

    题目链接 思路 求不可重叠最长重复子串,也可以利用height[i]height[i]height[i]. 二分枚举答案KKK 当height[i]≥Kheight[i] \ge Kheight[i] ...

  2. 后缀数组--(可重叠最长重复子串问题)

    问题描述:给定一个字符串,求最长重复子串,这两个子串可以重叠. 其实问题可以转化为height数组的最大值.至于为什么是这样,我可以这样解释: 求可重叠最长重复子串等价于求两个后缀的最长公共前缀的最大 ...

  3. 最长可重叠的重复子串(2)

    http://www.ahathinking.com/archives/121.html 文章作者: Yx.Ac   文章来源: 勇幸|Thinking ( http://www.ahathinkin ...

  4. 无重复最长子串python_leetCode 无重复字符的最长子串 python(Longest Substring Without Repeating Characters) python...

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. Default 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 &quo ...

  5. python学习3. 无重复字符的最长子串(滑动窗口)

    makcooo 2019-04-19 15:47:32  271  收藏 分类专栏: python 版权 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: &quo ...

  6. LeetCode 3. 无重复字符的最长子串(Longest Substring Without Repeating Characters)

    题目描述 给定一个字符串,找出不含有重复字符的最长子串的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. ...

  7. 文巾解题3. 无重复字符的最长子串

    1 题目描述 2 解题思路 以字符串 abcabcbb 为例,找出从每一个字符开始的,不包含重复字符的最长子串,那么其中最长的那个字符串即为答案. 我们列举出这些结果,其中括号中表示选中的字符以及最长 ...

  8. python练习题:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度

    题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 题目解析: 有一个字符串,长度不定, 要找出不重复字符串的长度,我们可以这么假设,先找到第一个下标,然后从后面拿到元素的下标对 ...

  9. 无重复字符的最长子串_滑动窗口

    思路: 这道题主要用到思路是:滑动窗口. 其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求.所以,我 ...

最新文章

  1. Pokémon Go数据收集是否带来隐私问题
  2. Identifiers in Java(Java标识符)
  3. 在eclipse中使用hadoop插件
  4. Java 集合List、Set、HashMap操作二(Map遍历、List反向、Set删除指定元素,集合只读、TreeMap操作、List转Array、List移动元素)
  5. 台达b2伺服modbus通讯_台达C2000促进油毛毡切割包装机的发展
  6. 你看过最好的心理学书籍是什么?
  7. android edittext获取 time值,在Android EditText中实现日期时间选择器(DatePicker和TimePicker)...
  8. android控件的touch事件_Android touch 事件分发时序
  9. WebSocket API 学习笔记
  10. HDLC、PPP、FR原理和配置
  11. ubuntu14.04安装ANSYS14.5的血泪史
  12. docker的使用方法
  13. C#【EF Core框架】使用乐观锁处理并发冲突
  14. 库尔巴克·莱布勒------KL散度
  15. java连接ldap服务器_java – LDAP:如何使用连接详细信息验证用...
  16. [A002]微擎新版本今日头条小程序
  17. 卫星遥感加持,农业更高效精准
  18. 2019年寒假 纪中培训总结
  19. 新加坡环球影城:新加坡亲子游一日游好去处
  20. 2018-2019 ACM-ICPC沈阳(C,J)

热门文章

  1. 海康威视错误代码0xf_海康威视嵌入式软件工程师笔试题分享(含解答)
  2. linux的dhcp的安装,linux下DHCP的安装配置
  3. mysql5.5 vsftpd_vsftpd-2.0.5+mysql-5.5+pam_mysql构建虚拟用户访问
  4. Ubuntu18.04安装配置Qt5.15
  5. Spring教程– Spring Core Framework教程
  6. struts2 log4j_Struts2和Log4j集成示例项目
  7. Android BroadcastReceiver示例教程
  8. dvm与art的区别_Android运行时– DVM与ART,AOT与JIT
  9. Android Studio 修改项目包名(Xposed)
  10. 开课吧:Web前端开发三大框架的特点