KMP算法 与 strstr()函数

简介: KMP算法 与 strstr()函数

1.strstr()函数--查找重复字符串第一次出现的位置

用于解决类似问题:给定两个字符串a,b,a字符串包含b字符串,求b字符串第一次在a字符串中出

现的位置,这时候我们就可以用strstr()函数了

include<bits/stdc++.h>
using namespace std;
int main() {
  char *str1 = "Hello";
  char *str2 = "el";
  char *result = strstr(str1,str2);
  cout<<result - str1<<endl;
  cout<<strstr(str1,str2)<<endl;
}

strstr()函数中的数据类型是 char 和 char,这里就不得不提及char的三种定义字符串的方式了

char str[] = {'H','e','l','l','o','\0'};
  cout<<str<<endl;
  
  char str1[] = "Hello";
  cout<<str1<<endl;
  
  char *str2 = "Hello";
  cout<<str2<<endl;

注意第一种写法最后的 '\0' 必须要写,否则输出时会产生乱码

2,KMP算法

使用next数组进行匹配的算法,一般先求next数组,再将母子数组进行比较

void getNext(int* next, const string& s) {
        int j = 0;
        next[0] = 0;
        for(int i = 1; i < s.size(); i++) {
            while (j > 0 && s[i] != s[j]) { // j要保证大于0,因为下面有取j-1作为数组下标的操作
                j = next[j - 1]; // 注意这里,是要找前一位的对应的回退位置了
            }
            if (s[i] == s[j]) {
                j++;
            }
            next[i] = j;
        }
    }

先求next数组

int strStr(string haystack, string needle) {
        if (needle.size() == 0) {
            return 0;
        }
        int next[needle.size()];
        getNext(next, needle);
        int j = 0;
        for (int i = 0; i < haystack.size(); i++) {
            while(j > 0 && haystack[i] != needle[j]) {
                j = next[j - 1];
            }
            if (haystack[i] == needle[j]) {
                j++;
            }
            if (j == needle.size() ) {
                return (i - needle.size() + 1);
            }
        }
        return -1;
    }
};

结果与strstr()函数的结果一致

相关文章
|
17小时前
|
存储 算法
图解Kmp算法——配图详解(超级详细)
图解Kmp算法——配图详解(超级详细)
|
17小时前
|
算法 测试技术 C#
【字典树】【KMP】【C++算法】3045统计前后缀下标对 II
【字典树】【KMP】【C++算法】3045统计前后缀下标对 II
|
17小时前
|
算法
【算法学习--字符串】(不含KMP算法)
【算法学习--字符串】(不含KMP算法)
|
17小时前
|
算法
白话 KMP 算法
白话 KMP 算法
17 2
|
17小时前
|
算法 Java 索引
算法基础:KMP算法详细详解
算法基础:KMP算法详细详解
|
17小时前
|
算法 测试技术 C++
【KMP】【二分查找】【C++算法】100207. 找出数组中的美丽下标 II
【KMP】【二分查找】【C++算法】100207. 找出数组中的美丽下标 II
|
17小时前
|
算法
KMP 算法小结
KMP 算法小结
12 0
|
17小时前
|
算法 搜索推荐 程序员
C语言第三十三练—— KMP算法和扩展 KMP算法
C语言第三十三练—— KMP算法和扩展 KMP算法
37 0
|
17小时前
|
算法 测试技术 C++
【数据结构】模式匹配之KMP算法与Bug日志—C/C++实现
【数据结构】模式匹配之KMP算法与Bug日志—C/C++实现
42 0
|
17小时前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。

热门文章

最新文章