222wan

导航

算法与数据结构——kmp算法

7-1 jmu-ds-实现KMP
分数 10
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int MAX_LEN = 20010;
//本题运用到字符串比对中的next[j]求法具体算法可以直接百度
//get_next就是用于求next[j]的这里只需要传入目标串就行
void get_next(char str[] ,int len, int next[])
{
    int i=0,j=0;
    next[0]= -1;
    for(i=0;i<len;i++)
    {

        while(j>0 && str[i] !=str[j])
        {
            j=next[j-1];
            if(str[i]==str[j]) j++;
            next[i]=j;
            
        }
    }
}
int find(char s[] ,int len_s ,char t[],int len_t,int  next[])
{
    int i=0;
    int j=0;
    while(i<len_s&&j<len_t)
    {
        if(j ==-1||s[i]==t[j])
        {
            j++;
            i++;
        }
        else
        {
            j=next[j];
        }
    }
    if(j==len_t)
  return i-j;
    else
        return -1;
}
int main ()
{

    int cas;
    char s[MAX_LEN],t[MAX_LEN];
    int next[MAX_LEN];
    scanf("%d" ,&cas);
    while(cas--)
    {

        scanf("%s %s",s,t);
       int len_s=strlen(s);//求出字符串的长度
        int len_t=strlen(t);
        get_next(t,len_t,next);//针对目标字符串求出next【j】
        if(find(s,len_s,t,len_t,next)!=-1)
        { printf("%d\n",find(s,len_s,t,len_t,next));
        }
        else{
            printf("not find!\n");}
        
        
    }
}

 

给两个字符串A、B, 从A中找出第一次出现B的位置。

输入格式:

第一行输入一个整数n,表示测试数据的个数

对于每组测试数据,输入两个字符串S T,S和T中间用一个空格隔开,每组数据占一行。

输出格式:

对于每组测试数据,输出A中找出第一次出现B的位置,如果A不包含B,输出“not find!”

输入样例:

3
abcdabbcd abbc
abcd efg
abbcdd bbc

上面是代码下面是有关模式传中next[j]以及nextval[j]的求法
 

输出样例:

4
not find!
1

 

 

posted on 2023-06-18 10:13  角落的蘑菇  阅读(21)  评论(1编辑  收藏  举报