我想在字符串 S 中找到与正则表达式 R 匹配的所有子字符串。正则表达式只能包含“。” 和符号(其中“.”表示任何符号)。我正在尝试使用 KMP 来解决这个问题:
1) 构建字符串 T = R + '#' + S ('#' 在这里是分隔符)
2) 计算前缀函数。对于 T
3) 对于 pi(T 的前缀函数)检查 '#' 之后的位置,其中 pi[i] == len(S)。在这些位置寻找子串结束。
但是前缀功能。不能在带有 '.' 的字符串上正常工作 我的前缀函数代码:
pi[0] = 0;
for (int j = 0, i = 1; i < R.length(); i++) {
while (j > 0 && s[i] != s[j] && s[i] != '.' && s[j] != '.' || s[i] == '#' || s[j] == '#')
j = pi[j - 1];
if (s[i] == s[j] || (s[i] == '.' && s[i] != '#') || (s[j] == '.' && s[j] != '#'))
j++;
pi[i] = j;
}
它在测试 S="abab", T="a." 时失败。
我知道可以使用 KMP 来解决这个问题,你能告诉我怎么做吗?