CSNotesCSNotes
TODO
LeetCode
数据结构
计算机组成原理
操作系统
计算机网络
数据库
Java
SSM
React
实用工具
GitHub
TODO
LeetCode
数据结构
计算机组成原理
操作系统
计算机网络
数据库
Java
SSM
React
实用工具
GitHub
  • 第一章 绪论

    • 1.1 数据结构的基本概念
  • 第二章 线性表

    • 2.1 线性表的定义和基本操作
    • 2.2 线性表的顺序表示
    • 2.3 线性表的链式表示
  • 第三章 栈、队列和数组

    • 3.1 栈
    • 3.2 队列
    • 3.3 栈和队列的应用
    • 3.4 数组和特殊矩阵
  • 第四章 串

    • 4.1 串的定义和实现
    • 4.2 串的模式匹配
  • 第五章 树与二叉树

    • 5.1 树的基本概念
    • 5.2 二叉树的概念
    • 5.3 二叉树的遍历和线索二叉树
    • 5.4 树、森林
    • 5.5 树和二叉树的应用
  • 第六章 图

    • 6.1 图的基本概念
    • 6.2 图的存储及基本操作
    • 6.3 图的遍历
    • 6.4 图的应用
  • 第七章 查找

    • 7.1 查找的基本概念
    • 7.2 顺序查找和折半查找
    • 7.3 树型查找
    • 7.4 B 树和 B+ 树
    • 7.5 散列表 (哈希表)
  • 第八章 排序

    • 8.1 排序的基本概念
    • 8.2 插入排序
    • 8.3 交换排序
    • 8.4 选择排序
    • 8.5 归并排序和基数排序
    • 8.6 外部排序
  • 第九章 贪心算法

    • 9.1 贪心算法
  • 第十章 动态规划

    • 10.1 动态规划

4.2 串的模式匹配

4.2.1 简单的模式匹配算法

Leetcode28 找出字符串中第一个匹配项的下标

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

主串和模式串都前移。

时间复杂度 O(nm)

class Solution
{
public:
    int strStr(string haystack, string needle)
    {
        int m = haystack.size(), n = needle.size();
        for (int i = 0; i + n <= m; i++)
        {
            int flag = true;
            for (int j = 0; j < n; j++)
            {
                if (needle[j] != haystack[j + i])
                {
                    flag = false;
                    break;
                }
            }
            if (flag)
            {
                return i;
            }
        }
        return -1;
    }
};

4.2.2 串的模式匹配算法——KMP 算法

前缀:除第一个字符外,字符串的所有头部子串

后缀:除最后一个字符外,字符串的所有尾部子串

部分匹配值:前缀和后缀最长相等前后缀长度

主串不动,模式串前移

时间复杂度 O(m+n)

class Solution {
public:
    int strStr(string haystack, string needle) {
        int n = haystack.size(), m = needle.size();
        if (m == 0) {
            return 0;
        }
        vector<int> pi(m);
        for (int i = 1, j = 0; i < m; i++) {
            while (j > 0 && needle[i] != needle[j]) {
                j = pi[j - 1];//字符不匹配,模式串指针前移
            }
            if (needle[i] == needle[j]) {
                j++;//字符匹配,双指针后移
            }
            pi[i] = j;//字符匹配,pi[j+1]=pi[j]+1
        }
        for (int i = 0, j = 0; i < n; i++) {
            while (j > 0 && haystack[i] != needle[j]) {
                j = pi[j - 1];
            }
            if (haystack[i] == needle[j]) {
                j++;
            }
            if (j == m) {
                return i - m + 1;
            }
        }
        return -1;
    }
};

求 next 数组

前后缀相等,next=0 时,i++,j++。否则 j++

next 数组为递增序列

求 nextval 数组

相同直接跳过,重复的字符比较失败不需要多次比较

nextval 数组可能为无序序列

编辑此页
上次更新:
Prev
4.1 串的定义和实现