首页 > 编程语言 >数据结构——入门到飞升——kmp算法

数据结构——入门到飞升——kmp算法

时间:2024-04-22 22:22:31浏览次数:20  
标签:string int pattern kmp Next ++ text 数据结构 飞升

给定一个字符串 text 和一个模式串 pattern,求 pattern 在text 中的出现次数。text 和 pattern 中的字符均为英语大写字母或小写字母。text中不同位置出现的pattern 可重叠。

输入格式:
输入共两行,分别是字符串text 和模式串pattern。

输出格式:
输出一个整数,表示 pattern 在 text 中的出现次数。

输入样例1:
zyzyzyz
zyz
输出样例1:
3
输入样例2:
AABAACAADAABAABA
AABA
输出样例2:
3

完全代码:

点击查看代码
#include <iostream>
#include <cstring>
using namespace std;

void getNext(const string& pattern, int* Next) {
    Next[0] = -1;
    int i = 0, j = -1;
    int m = pattern.size();
    while (i < m) {
        if (j == -1 || pattern[i] == pattern[j]) {
            i++;
            j++;
            Next[i] = j;
        } else {
            j = Next[j];
        }
    }
}

int kmp(const string& text, const string& pattern) {
    int n = text.size(), m = pattern.size();
    if (n < m) return 0; // 如果文本串长度小于模式串,直接返回0

    int Next[m + 1];
    getNext(pattern, Next);

    int count = 0;
    int i = 0, j = 0;
    while (i < n) {
        if (j == -1 || text[i] == pattern[j]) {
            i++;
            j++;
        } else {
            j = Next[j];
        }
        if (j == m) { // 找到一个匹配
            count++;
            j = Next[j];
        }
    }
    return count;
}

int main() {
    string text, pattern;
    cin >> text >> pattern;
    cout << kmp(text, pattern) << endl;
    return 0;
}

标签:string,int,pattern,kmp,Next,++,text,数据结构,飞升
From: https://www.cnblogs.com/sly-345/p/18151590

相关文章

  • 数据结构的练习day1
    链表只能一个一个的遍历,不能通过随机访问来获取节点链表的地址是并要求连续的,是通过内部的指针来进行联系的/***************************************************************************************************************Copyright(c)2023-2024......
  • 数据结构
    顺序表的特点物理存储上元素空间连续:顺序表在内存中占据一块连续的内存空间,便于通过下标快速访问元素。随机访问:由于元素连续存储,顺序表支持根据下标直接访问任意位置的元素,时间复杂度为O(1)。插入和删除操作可能涉及元素移动:在顺序表中插入或删除元素,可能需要移动大量元素以......
  • 数据结构笔试题 Day 1
    笔试题1已知一个顺序表L,其中的元素递增有序排列,设计一个算法,插入一个元素x(x为int型)后保持该顺序表仍然递增有序排列(假设插入操作总能成功)./递增排序12304055voidSeqList_Insert(SeqList*L,intx){inttemp=-1;//记录待插入元素的下标//遍历......
  • redis list数据结构操作学习
    转自:https://zhuanlan.zhihu.com/p/765785471.插入元素>rpushmylistA#从右侧插入(integer)1>rpushmylistB(integer)2>lpushmylistfirst(integer)3>lrangemylist0-1//这里使用0-1表示显示所有元素,注意是:0空格-1,0代表第一个元素,-1代表最后......
  • MySQL-06.索引的数据结构
    1.为什么使用索引索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章。MySQL中的索引也是一样的道理,进行数据查找时,首先查看查询条件是否命中某条索引,符合则通过索引查找相关数据,如果不符合则需要全......
  • Redis介绍、使用、数据结构和集群模式总结
    Redis(RemoteDictionaryServer)是一个开源的,基于内存的数据结构存储系统,它支持多种数据结构,如字符串(String)、列表(List)、集合(Set)、有序集合(SortedSet)、散列(Hash)等。Redis不仅可以用作数据库、缓存和消息代理,还可以通过复制、持久化、高可用性和分区提供强大的数据保障。以下是关于......
  • (数据结构代码,总结,自我思考)=> { return 个人学习笔记; } 【To be continued~】
    俗话说“学而不思则罔”,是时候复习和整理一下自己先前的学习历程了!Chapter-One《BinarySearch》publicstaticintbinarySearch(int[]a,inttarget){inti=0,j=a.length-1;while(i<=j){intm=(i+j)>>>1;//求......
  • 数据结构与算法学习(1)——DFS(深度优先搜索)
    DFS基础深度优先搜索算法(英语:Depth-First-Search,缩写为DFS)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发......
  • Python与Java数据结构语法区别
    数组参考链接:CS61BPythonzeroedLst=[0,0,0]lst=[4,7,10]lst[0]=5print(lst[0])print(lst)print(len(lst))Javaint[]zeroedArray=newint[3];int[]array={4,7,10};array[0]=5;System.out.println(array[0]);System.out.println(Ar......
  • 数据结构-线性结构-基础介绍
    前言本文是看bilibili·王道考研·数据结构的视频课程时做的一些记录,如构成侵权,请联系我删除另外,本文有部分内容是根据我的理解写的,可能有不明确的地方awa王道考研的视频地址我就不放了,大家请移步bilibili直接搜索王道考研就能搜索到线性结构-一对一关系除了第......