问题背景:有一个用户留言板,留言在100字内,另外有一个滤词表,现在需要对用户留言进行过滤,清楚留言中出现并且出现在滤词表中的单词
针对留言长度相对于滤词表单词而言较短,可采用如下滤词法
1.构建滤词表的HashMap(filterMap)
对滤词表中的每个单词做一次Hash,以Hash散列值作为Key,单词内容作为Value
2.构建滤词表单词的起始符表和结束符表
2.1起始符表
将滤词表中每个单词的起始字符构建成一个表,作为起始符表(startList)
2.2结束符表
将滤词表中每个单词的结束字符构建成一个表,作为结束符表(endList)
3.搜索留言敏感词
1)从留言第一个字开始,与startList中的字符匹配
1.1)如果匹配到起始字符,搜索ai的下一个字符ai+1,查看ai+1是否存在endList
1.1.1)如果匹配到则截取留言a1到ai+1的n个字符,并在filterMap中查找这n个字符hash值
1.1.1.1)如果filterMap中查找到了这n个字符,则清除或记录敏感词后从ai+2继续重复1)
1.1.1.2)如果filterMap没有查找到这n个字符,则从ai+1个字符开始重复1)
1.1.2)如果ai+1不存在于endList,则从ai+2开始重复1.1)
1.2)如果没有匹配到起始字符,则继续往后搜索,在startList中查找留言中的ai+1,重复1),直到留言所有字符搜索完成
例子:
留言"fuckfucok"
滤词表"fuck" "damn"
滤词表单词最大长度maxLenth = 4;
filterMap(假设hash值如下)
"1" => "fuck"
"2" => "damn"
startList {"f", "d"}
endList{"k", "n"}
首先查找"fuckfucok"的第一个字符f
在startList中找到了f,然后查找u,不存在于endList,再查找c,不存在于endList,再查找k,存在于endList,就可以对fuck进行hash然后在filterMap中匹配了,匹配到后清除fuck,然后从k的下一个字符f再次开始匹配,发现f在startList中,重复上述操作,找到最后一个字符k,发现长度已经超过maxLenth,匹配结束
最后滤词结果****fucok;