数据结构KMP等算法next函数值不清楚如何求,ps:KMP算法原理我懂,就差next函数值及其应

2025-04-15 07:44:08
推荐回答(1个)
回答1:

#include 
#include 
using namespace std;

class KMP
{
public:
// 构造函数
KMP(string pattern, string origin)
:pat(pattern), ori(origin) 
{
next = new int[pattern.size() + 1];
next[0] = -1;
calcuNext();    // 计算next数组

count = 0;
}
// 计算next数组
void calcuNext()
{
int i = 0, j = -1;
while(i < pat.size())
{
if(j == -1 || pat[i] == pat[j])
next[++i] = ++j;
else
j = next[j];
}
}
        
        // 用KMP算法匹配
void kmpMatch()
{
int i = 0, j = 0;
while(i < ori.size())
{
if(j == -1 || ori[i] == pat[j])
{
    ++i;
    ++j;
}
else
    j = next[j];

if(j == pat.size()) ++count;
}
}
        
        // 返回源串中模式串出现的次数
int getCount() const
{
return count;
}

private:
//
string ori; // 源串
string pat; // 模式串

int* next;     // next数组(针对pat)
                // 每次移位的个数只与模式串有关
int count; // 模式串在源串中出现的次数
};

int main()
{
int n;
cin >> n;
while (n--)
{
string pat, ori;
cin >> pat >> ori;
KMP kmp(pat, ori);
kmp.kmpMatch();
cout << kmp.getCount() << endl;
}
return 0;
}

上面一段代码,你参考一下,里面有注释~