C++ Aho-Corasick算法
请帮我找出这段代码中的错误。我编写了一个简单的程序,通过Aho Corasick算法将n个字符串添加到trie中,但它不能正常工作。输入字符串后它崩溃。这段代码有什么问题C++ Aho-Corasick算法,c++,string,aho-corasick,C++,String,Aho Corasick,请帮我找出这段代码中的错误。我编写了一个简单的程序,通过Aho Corasick算法将n个字符串添加到trie中,但它不能正常工作。输入字符串后它崩溃。这段代码有什么问题 #include <cstdlib> #include <iostream> #include <vector> #define ALPHABET 26 using namespace std; struct item { int next[ALPHABET];
#include <cstdlib>
#include <iostream>
#include <vector>
#define ALPHABET 26
using namespace std;
struct item
{
int next[ALPHABET];
int leaf;
item()
{
for (int i = 0; i < ALPHABET; i++)
next[i] = -1;
leaf = 0;
}
};
vector <item> trie;
int add_string(string &s)
{
int z = 0;
item temp;
for (int i = 0; i < s.length(); i++)
{
char c = s[i] - 'a';
if (trie[z].next[c] == -1)
{
trie[z].next[c] = trie.size();
trie.push_back(temp);}
z = trie[z].next[c];
}
trie[z].leaf = true;
}
}
int main(int argc, char *argv[])
{
int n;
cin >> n;
string s[n];
for (int i = 0; i < n; i++)
cin >> s[i];
for (int i = 0; i < n; i++)
add_string(s[i]);
system("PAUSE");
return EXIT_SUCCESS;
}
#包括
#包括
#包括
#定义字母表26
使用名称空间std;
结构项
{
int next[字母表];
内叶;
项目(
{
for(int i=0;i>n;
字符串s[n];
对于(int i=0;i>s[i];
对于(int i=0;i
我对算法一无所知,所以我不知道它是否正确运行。然而,仅仅基于通过gdb运行代码,您需要从trie
向量中至少一个元素开始。你可以通过写作来做到这一点
vector <item> trie(1);
向量trie(1);
其中
1
表示向量应从多少个元素开始。有了这个更改,代码运行得很好(但我不知道它是否正确地运行了算法)。您是否尝试过调试任何东西?它是如何崩溃的?错误消息是什么?注意:strings[n]代码>使用gcc ism。在C++中,数组的维数应该在编译时固定(除非动态分配),VLA(可变长度数组)严格地是C99,并且在C++中使用它们是非标准的(因此是不可移植的)。建议使用std::vector s(n)代码>相反。我认为你是对的。我将添加搜索功能来检查它是否有效。