为什么此KMP代码显示运行时错误?

时间:2016-05-06 19:28:16

标签: algorithm c++11 codeblocks

从函数返回向量是否会产生任何问题?或者只是一些基本的语法问题?

这只是来自CLRS的示例代码。 computePrefix函数计算给定模式的正确前缀的值,并匹配main函数中的值。

使SIGSEGV错误更精确。你的善意建议真的很有帮助。

谢谢。

#include <bits/stdc++.h>

using namespace std;

int main()
{
    string text, pattern;
    vector<int> computePrefixFunction(string p);
    cin >> text;
    cin >> pattern;
    int n = text.length();
    int m = pattern.length();
    vector<int> pi = computePrefixFunction(pattern); 
    int q = -1;
    for(int i = 0; i < n; ++i)
    {
        while(q > -1 && pattern[q+1] != text[i])
            q = pi[q];
        if(pattern[q+1] == text[i])
            q = q + 1;
        if(q == (m-1))
        {
            cout << "Pattern occurs from position: " << q - m + 1 << '\n';
            q = pi[q];
        }
    }
    return 0;
}

vector<int> computePrefixFunction(string p)
{
    int m = p.length();
    vector<int> pi;
    pi[0] = -1;
    int k = -1;
    for(int q = 0; q < m; ++q)
    {
        while(k > -1 && p[k+1] != p[q])
            k = pi[k];
        if(p[k+1] == p[q])
            k = k + 1;
        pi[q] = k;
    }
    return pi;
}

1 个答案:

答案 0 :(得分:1)

要使用vector,请push_back向其中添加元素。如果您只是初始化它而没有像computePrefixFunction第二行那样的大小,那么尝试访问pi[0]pi[q]会给您一个运行时错误。相反,请pi.push_back(value)