C++ 字符串匹配算法:next 数组的实现与优化

在字符串匹配算法中,next 数组是一个非常重要的概念,它记录了每个前缀的最长相同前后缀长度,可以有效地减少匹配过程中的回溯次数,提高匹配效率。本文将详细讲解 next 数组的实现以及优化方法。

next 数组的原理

next 数组的定义:对于一个字符串 snext[i] 表示 s[0:i] 的最长相同前后缀的长度。

例如,对于字符串 s = 'ababc',它的 next 数组为 [0, 0, 1, 0, 1]

next 数组的应用:在字符串匹配算法中,当匹配过程中出现失配时,可以使用 next 数组来快速移动匹配指针,避免不必要的回溯,从而提高匹配效率。

next 数组的实现

以下是使用 C++ 代码实现 next 数组的代码:

vector<int> getnext(string s) {
    vector<int> next(s.size(), 0); // 将数组初始化为0
    int j = 0; // 前缀末尾     
    for(int i = 1; i < s.size(); i++) // i后缀末尾     
    {
        while(j > 0 && s[i] != s[j]) // 如果不匹配,往前跳
        {
            j = next[j - 1];         
        }
        if(s[i] == s[j]) // 如果匹配,j++
            j++;         
        next[i] = j; // 记录next值     
    }
    return next;  
}

代码优化

  1. next 数组的类型应该是 vector<int>,而不是 vector<int>[s.size()],因为后者定义的是一个数组,而不是一个向量。
  2. 在初始化 next 数组时,应该将所有元素都初始化为 0,而不是留空。
  3. while 循环中,应该先判断 j 是否大于 0 再判断 s[i]s[j] 是否相等,否则可能会越界。
  4. 记录 next 值应该在 for 循环里面,而不是在 while 循环里面。

代码解释

  • vector<int> next(s.size(), 0);:初始化一个大小为 s.size()vector<int>,并将其所有元素都初始化为 0。
  • int j = 0;j 指针指向当前前缀的末尾。
  • for(int i = 1; i < s.size(); i++):遍历字符串 s,从第一个字符开始。
  • while(j > 0 && s[i] != s[j]):当 j 大于 0 且当前字符 s[i] 与当前前缀的最后一个字符 s[j] 不匹配时,j 指针向前移动,指向 next[j - 1] 位置,继续比较。
  • if(s[i] == s[j]) j++;:当当前字符 s[i] 与当前前缀的最后一个字符 s[j] 匹配时,j 指针向后移动。
  • next[i] = j;:记录当前前缀的最长相同前后缀的长度。

总结

本文详细讲解了 C++ 中字符串匹配算法中的 next 数组实现,并对代码进行了优化,使其更加高效稳定。文章分析了 next 数组的原理,并通过实例解释了代码中每个步骤的意义。希望本文能够帮助读者更好地理解 next 数组的实现和应用。

C++ 字符串匹配算法:next 数组的实现与优化

原文地址: https://www.cveoy.top/t/topic/mQCW 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录