限制有限状态自动机字符串匹配的字母表

Limiting the alphabet for finite state automata string matching

您好,我已经编写了有限状态自动机字符串匹配算法。但是,我正在努力将字母表限制为只有两个字符。我的实现看起来类似于 http://www.sanfoundry.com/cpp-program-perform-finite-state-automaton-based-search/

NO_OF_CHAR 变量表示程序的字母表。我试图将其限制为只有两个字符 {0,1} 例如:0101001。如果有人了解有限状态自动机,将不胜感激。

来自 OP 对我的程序输入问题的回答:

char text[]="0101001010101"; char pattern[]="1001";

所以你给它一个普通的字符串,其中的字符用 ASCII 编码。 FSM 使用这些字符来索引状态和转换 table(第 60 行。)输入字符串中的字符“0”是 48 的 int 值,而“1”是 49。当您声明数组 2 时-items long 这些值会导致表达式超出数组限制并读取一些随机数据。这会导致程序向意想不到的方向徘徊并最终崩溃。这是未定义行为的特例。

解决方法:设置NO_OF_CHAR至少4949+1。 (谢谢@wildplasser!)

答案已被接受,但我 post 这是基于 OP 在之前关于该主题的问题中的坚持,必须只有 2 种可能性。

int TF[][NO_OF_CHARS] 是一个最初大小为 #define NO_OF_CHARS 256 的数组。所以在这个例子中所有可能的 unsigned char 值都可以索引它。当您尝试将字符数减少到 2 时,您只能通过 01 索引此数组,但如果您的 '0''1'蜂窝字符串是 ASCII 值,它们会破坏数组。

基于这条线(可能还有其他线)正在修复阵列

state = TF[state][txt[i]];

请注意,对于字符 '0''1',数组将由 4849 索引。您需要在这里(可能在其他地方)做的是

state = TF[state][txt[i] & 1];

还要注意是否有任何地方将 01 的索引变回 char。如果是这样,您需要将 '0' 添加到数组索引。