首页 > 编程语言 >c++字符串搜索之KMP

c++字符串搜索之KMP

时间:2023-07-29 14:55:05浏览次数:39  
标签:needleLen string int needle c++ str KMP 字符串 haystack

class Solution
{
private:
    void getNext(int* arr, string str) {
        int len = str.length();
        arr[0] = 0;
        int j = 0;
        for (int i = 1; i < len; i++)
        {
            while (j > 0 && str[i] != str[j]) {
                j = arr[j - 1];
            }

            if (str[i] == str[j]) {
                j++;
            }

            arr[i] = j;
        }
    }

public:
    int indexOf(string haystack, string needle) {
        int needleLen = needle.length();
        int haystackLen = haystack.length();
        int* next = new int[needleLen];
        getNext(next, needle);
        for (int i = 0; i < haystackLen; i++) {
            if (haystack[i] == needle[0]) {
                int j = 1;
                while (j < needleLen && j > 0) {
                    if (haystack[++i] != needle[j++]) {
                        j = next[j - 2];
                        i--;
                    }
                }
                if (j == needleLen)return i-needleLen+1;
            }

        }
        return -1;
    }

};
    //KMP
    string haystack = "aabaabaafa";
    string needle = "aabaaf";
    int res = s1.indexOf(haystack, needle);
    cout << "your answer is: " << res << " it's " <<
        ((res == 3) ? "correct!" : "wrong!!!")
        << endl;

 

标签:needleLen,string,int,needle,c++,str,KMP,字符串,haystack
From: https://www.cnblogs.com/laremehpe/p/17589825.html

相关文章

  • day3c++学习
    1内存分区模型C++程序在执行时,将内存大方向划分为4个区域代码区:存放函数体的二进制代码,由操作系统进行管理的全局区:存放全局变量和静态变量以及常量栈区:由编译器自动分配释放,存放函数的参数值,局部变量等堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收......
  • 解决:vscode插件C/C++ CompileRun 输出中文乱码问题
    打开插件设置在该设置中加入语句-fexec-charset=GBK即可......
  • C++ Primer Plus学习笔记
    仅限main函数,如果没有返回语句,编译器会加隐含的返回语句:return0;WIN1064位系统中,sizeof(int)==sizeof(long)==4.C++17之后,新增byte数据类型,在标头<cstddef>中定义,取值范围[0-255],初始化:std::byteb{42};char取值范围[-128,127]原始字符串R"(string)"R"+*(......
  • ORA-32004:为字符串实例指定的已过时或不推荐使用的参数
    错误信息【汉】ORA-32004:为字符串实例指定的已过时或不推荐使用的参数【英】ORA-32004:obsoleteordeprecatedparameter(s)specifiedforstringinstance例在启动实例时,提示此错误,但数据库正常启动。版本Oracle【11.2.0.3.0】、【11.2.0.1.0】、【11.2.0.4.0】原因服务器中spfi......
  • 686. 重复叠加字符串匹配
    给定两个字符串 a和b,寻找重复叠加字符串a的最小次数,使得字符串b成为叠加后的字符串a的子串,如果不存在则返回-1。注意:字符串"abc" 重复叠加0次是"",重复叠加1次是 "abc",重复叠加2次是 "abcabc"。 示例1:输入:a="abcd",b="cdabcdab"输出:3解释:a重复叠加三遍......
  • 导入表T1某字段截取的子字符串到另一张表T2
    第1章、字符串定位和截取--匹配字符的位置--从左往右第一次出现字符.log的位置SELECTINSTR('m/mc/kh.log','.log')FROMT1:--返回8--从右往左第一次出现/的位置SELECTINSTR('m/mc/kh.log','/',-1,1)FROMT1:--返回5--字符串截取,截取从3开始的6位字符......
  • 链表/栈/队列/KMP
    链表用数组模拟,不同于结构体加指针调用new关键字开上万级别的节点非常慢,基本会超时单链表来构造邻接表用于存图与树基本结构:head表示头结点的下标e[i]表示节点i的值ne[i]表示节点i的下一个节点的下标idx存储当前已经用到了哪个节点,表示新节点基本操作:......
  • 字符串压缩
    字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。示例1:输入:"aabcccccaaa"输出:"a2b1c5a3"示例2:输入:"abbcc......
  • C#与C++动态链接库DLL参数互传
    C#与C++动态链接库DLL参数互传一、C#中导入C++动态链接库二、C#传入字符串参数三、C++传出字符串参数四、C++传出vector一、C#中导入C++动态链接库从界面程序开发的角度来说,C#语言效率较C++高,且通过WPF开发出的程序界面更为美观,但在开发实际项目中有时不可避免的需要使用C++程序库......
  • C#动态调用C/C++的DLL
    C#调用C/C++的dll有两种方式,下边就写一下两种不同方式的调用方法。1.DllImport方式[DllImport("CalcDll")]publicexternintAdd(inta,intb);其中CalcDll为C++动态库,Add为动态库中的方法,使用DllImport引入需要加载的DLL,使用关键字extern修饰C++库中的方法,之后正常调用即可。......