首页 > 编程语言 >算法与数据结构——kmp算法

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

时间:2023-06-18 10:23:52浏览次数:41  
标签:int next char 算法 str kmp 数据结构 find

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

 

 

标签:int,next,char,算法,str,kmp,数据结构,find
From: https://www.cnblogs.com/222wan/p/17488767.html

相关文章

  • 数据结构课程设计2023夏7-4 先序和中序构造二叉树
    本题目要求用先序序列和中序序列构造一棵二叉树(树中结点个数不超过10个),并输出其后序序列。输入格式:在第一行中输入元素个数。第二行中输入先序序列,用空格分隔。第三行中输入中序序列,用空格分隔。输出格式:输出此二叉树的后序序列,用空格分隔,最后也有一个空格。输入样例:......
  • 关于KMP
    关于KMP平凡,而又不平凡的一天,12月31日,2022年的最后一天,让我们用几句代码迎接新年的到来。cout<<"Goodbye2022\n";printf("Hello2023!");扯正题。Kmp的简介KMP算法是字符串匹配算法,基础的用途是在文本串中快速查找与模式串相匹配的位置。一些感想我们在研究这个算法的......
  • Python-练脑系列-03数据结构
    练脑不断,快乐不止;本次是第三期练脑。1、给定一个列表,其中每个元素都是一个由数字和运算符组成的字符串,例如['2+3','4*5','6/3'],计算列表中所有元素的值,并返回结果的列表。2、给定一个列表和一个整数k,返回列表中所有长度为k的连续子序列中的最大值。3、给定一个字典,其中键和值......
  • 代码随想录Day24|回溯算法+JAVA大作战
     今日任务39. 组合总和40.组合总和II131.分割回文串 93.复原IP地址  78.子集   90.子集II   39.组合总和classSolution{List<List<Integer>>ans=newArrayList<>();LinkedList<Integer>now_ans=newLinkedList<>();publicLi......
  • 数据结构-枚举
    在Java中,枚举(Enumeration)是一种特殊的数据类型,用于定义一组具名的常量。枚举常量是一组预定义的值,它们在枚举类型中被列出,每个常量都有一个名称和一个关联的值。枚举类型在Java中是通过关键字enum来定义的。定义枚举类型后,可以使用枚举常量来表示具体的取值。enumSeason{......
  • [ML从入门到入门] 初识人工神经网络、感知机算法以及反向传播算法
    前言人工神经网络(Artificialneuralnetworks,ANNs)被广泛认为诞生于20世纪四五十年代,其核心理论可以追溯到19世纪初 Adrien-MarieLegendre发明的最小二乘法,而在今天,经过了半个世纪互联网和计算机技术的迅猛发展,这片耕耘良久的沃土重新掀起了机器学习的研究热潮。本文主要......
  • 数据结构
    Java提供了许多常见的数据结构,包括但不限于以下几种:数组(Array):用于存储固定大小的元素序列。动态数据(ArrayList)链表(LinkedList):通过节点之间的链接关系来存储元素的线性数据结构。栈(Stack):遵循后进先出(LIFO)原则的数据结构,可以用于存储和检索元素。队列(Queue):遵循先进先出(FIFO)原......
  • Day03 3.3 使用Python还原算法
    Day033.3使用Python还原算法加密分类1、单向加密:MD5、sha系列不可逆2、对称加密:AES、DES3、非对称加密:RSA、DSA4、补充算法:base64【一】md5importhashlibm=hashlib.md5()m.update('helloworld'.encode("utf8"))print(m.hexdigest())【二......
  • Java彩虹渐变算法
    彩虹渐变算法前言​ 最近有一个需求是需要一直去改变字体的颜色,然后我就想到了使用彩虹颜色作为字体颜色,使颜色按照彩虹颜色的顺序进行变化。​ 然后查了一下彩虹的颜色可以分为6种(对,不是七种),用RGB来表示分别是#FF00FF,#FFFF00,#00FF00,#00FFFF,#0000FF,#FF00FF,因此我们只需要......
  • 数据结构:栈与队列
    栈:栈是一种后进先出的数据结构,我们可以想象为一个瓶子,往里放东西。又比如,函数的递归调用,就是一种栈的结构。php中用数组实现栈:$arr=array();//入栈functionpush(&$arr,$val){$size=count($arr);$arr[$size]=$val;}//出栈functionpop(&$arr){$si......