在互联网上,由于一些政策法规,需要对一些帖子或者聊天记录进行关键字屏蔽,本文使用KMP模式匹配算法,将目标串S中的敏感词汇全部替换成*。
实际应用中需要一个屏蔽词库,需将每个屏蔽词条作为模式串T,分别过滤一次S串。
考虑到屏蔽词库中有相同前缀的屏蔽词,比如:“朱令”和“朱令案”,所以可以预先将屏蔽词库中的屏蔽词按照长度做由大到小的排序。先过滤长词,再过滤短词即可。
int getNext(char* s, int next[]) {
next[0] = -1;
int i = -1;
int j = 0;
while (j < strlen(s)) {
if (i == -1 || s[i] == s[j]) {
i++;
j++;
next[j] = i;
} else {
i = next[i];
}
}
return 0;
}
int kmp(char* str, char* t, int next[]) {
int j = 0;
int i = 0;
while (str[i] != '\0' && t[j] != '\0' && strlen(str) - i >= strlen(t) - j) {
if (str[i] == t[j]) {
i++;
j++;
} else {
j = next[j]