zoukankan      html  css  js  c++  java
  • 数据结构实验之串一:KMP简单应用

    数据结构实验之串一:KMP简单应用

    Time Limit: 1000MS Memory limit: 65536K

    题目描述

    给定两个字符串string1和string2,判断string2是否为string1的子串。

    输入

     输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。

    输出

     对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。

    示例输入

    abc
    a
    123456
    45
    abc
    ddd
    

    示例输出

    1
    4
    -1
    



    #include<bits/stdc++.h>  
    using namespace std;  
    int next[1000001];  
    int len1,len2;  
    char string1[1000001],string2[1000001]; 
    void kmp(int x,int y)  
    {  
        int i=0,j=0;  //初始化,从头开始便利
        while(i<x&&j<y)  //遍历完主串或模式串跳出循环
        {  
            if(j==-1||string1[i]==string2[j])  
            {  
                i++;
                j++;  
            }  
            else  
                j=next[j];  
        }  
        if(j>=y)  
            printf("%d\n",i-j+1);  
        else  
            printf("-1\n");  
    }  
    void get_next(int len)  
    {  
        int i=0;next[0]=-1;int j=-1;//在字符串中第一个字符没有前缀,因此赋予初值-1,(当然如果你是从零开始输入的赋值为0)  
        //这样得到第二个字符的next值就是0,因为第二个字符也只能回溯到0.  
        while(i<len)  
        {  
            if(j==-1||string2[i]==string2[j])  
            {  
                i++;j++;next[i]=j;//这里就是找前缀和后缀字符串长度的最大值,当比较不相等时,就回溯到这个下标的下一个再接着进行比较。  
            }  
            else  
                j=next[j];//如果不相等就回溯的string【j】的位置再接着进行比较。  
        }  
    }    
    int main()  
    {  
        while(~scanf("%s%s",string1,string2))  
        {  
            len1=strlen(string1); // 存放主串的长度
            len2=strlen(string2);  //存放模式串长度
            get_next(len2-1);  
            kmp(len1,len2);  
        }  
    }  

  • 相关阅读:
    CodeForces 156B Suspects(枚举)
    CodeForces 156A Message(暴力)
    CodeForces 157B Trace
    CodeForces 157A Game Outcome
    HDU 3578 Greedy Tino(双塔DP)
    POJ 2609 Ferry Loading(双塔DP)
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛十六进制转换成十进制
  • 原文地址:https://www.cnblogs.com/CCCrunner/p/11782169.html
Copyright © 2011-2022 走看看