LeetCode-28. 找到字符串中第一个匹配项的下标

KMP 算法

基本概念

  • S:文本串
  • P:模式串
  • next 数组:next[i]表示当模式串中第 i 个字符与文本串中某个字符不匹配时,模式串应该跳到文本串的哪个位置继续匹配。

next 数组含义及计算

对于模式串Pnext[i]表示P[1 ... i-1]这个子串的最长相同前后缀的长度。也就是说,如果P[i]与文本串S的某个字符不匹配,那么我们可以将P向右移动next[i]个位置,使得P[1 ... next[i]]P[i-next[i] ... i-1]对齐,继续比较P[next[i]]S的下一个字符。这样可以避免重复比较已经匹配的部分,提高效率。

next 数组的求法是通过模板串自己与自己进行匹配操作得出来的

// 计算next数组
for(int i = 2; j = 0; i <= m; i++) {
   
    // 匹配不成功
    while(j > 0 && p[i] != p[j+1]) {
   
        j = next[j];
    }

    // 匹配成功
    if(p[i] == p[j+1])  j++;
    next[i] = j;
}

匹配过程

// 匹配
for(int i = 1, j = 0; i <= n; i++) {
   
    // 匹配不成功
    while(j > 0 && s[i] != p[j+1]) {
   
        j = next[j];
    }

    // 匹配成功
    if(s[i] == p[j+1])  j++;
    // 匹配完成
    if( j == m )  return i - m;
}

LeetCode-28.找到字符串中第一个匹配项的下标

题目描述

给你两个字符串 haystackneedle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1

程序代码

class Solution {
   
public:
    int strStr(string haystack, string needle) {
   
        int n = haystack.size(), m = needle.size();

        string s = " " + haystack;
        string p = " " + needle;

        vector<int> next(m + 1, 0);

        // 计算next数组
        for(int i = 2, j = 0; i <= m; i++) {
   
            // 匹配不成功
            while(j > 0 && p[i] != p[j+1]) {
   
                j = next[j];
            }

            // 匹配成功
            if(p[i] == p[j+1])  j++;
            next[i] = j;
        }

        // 匹配
        for(int i = 1, j = 0; i <= n; i++) {
   
            // 匹配不成功
            while(j > 0 && s[i] != p[j+1]) {
   
                j = next[j];
            }

            // 匹配成功
            if(s[i] == p[j+1])  j++;
            // 匹配完成
            if( j == m )  return i - m;
        }
        return -1;
    }
};

最近更新

  1. TCP协议是安全的吗?

    2023-12-20 15:36:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-20 15:36:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-20 15:36:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-20 15:36:01       18 阅读

热门阅读

  1. React中的useMemo钩子

    2023-12-20 15:36:01       39 阅读
  2. Vue Teleport和Vue的介绍

    2023-12-20 15:36:01       37 阅读
  3. 【算法】【动规】摆动序列

    2023-12-20 15:36:01       44 阅读
  4. excel技巧

    2023-12-20 15:36:01       38 阅读
  5. 【.Net 6.0--通用帮助类--总览】

    2023-12-20 15:36:01       46 阅读
  6. Spark报错:顶级Product编程

    2023-12-20 15:36:01       41 阅读
  7. Docker 如何删除所有没有名字的镜像

    2023-12-20 15:36:01       40 阅读
  8. vue3虚拟dom和diff算法实现(模仿源码)

    2023-12-20 15:36:01       34 阅读
  9. npm run build Last few GCs

    2023-12-20 15:36:01       42 阅读
  10. 华纳云:Ubuntu下LAMP环境如何配置

    2023-12-20 15:36:01       36 阅读