问题描述:给定一个字符串集合S={“abc”,“gghh”,“yefbgj”},设计并实现一个算法,在给定文本中找出这些字符串的不连续出现(不连续出现,例如“abdcdshfkajhg”这个文本中就包含了“abc”)。
一些多模式匹配算法如:AC算法,WM算法等,都是去寻找给定的文本中是否包含目标字符串,例如在一个网页中寻找多个敏感词。然而,寻找的敏感词必须在文本中是完整连续的。例如其中一个目标字符串为“abbc”,那么“acbbc”是无法检测到的。为了去寻找一个非连续的目标字符串,可以采用Trie树,也叫做前缀树来实现。
首先利用字符串集合S构建一个Trie树。
集合currentnodes记录了待匹配的所有节点,初始值为TrieTree的根节点的子节点。然后对于读取到的每一个字符判断是否在currentnodes集合中。如果不在则继续判断下一个。如果在,判断是否是结束字符。如果不是结束字符,则将该节点从currentnodes移除,将它的子节点加入。如果是结束字符,则将该字符对应的字符串添加到结果中。
Input1: TrieTree
Input2: targetFile
Set currentnodes = new Set(TrieTree);
int MAX_GAP=30;
while(targetfile.readChar.next!= null){
for node in currentnodes:
if targetfile.readChar.character == node.character && targetfile.readChar.order-node.order < MAX_GAP:
if node.isEnd:
find a discontinuous string string;
result.append(node.getString);
else:
currentnodes.remove(node);
currentnodes.addAll(node.childList);
}
output: result.