假设我有一个随机生成的字符串s=t&^%JHGgfdteam*&HGEdfg
,那么计算该字符串中英文单词数量的最佳方法是什么? (英语单词在某些词典文件中定义)。显然蛮力不是一个好主意......后缀是否会起作用?二进制搜索?请注意,在s
的情况下,有两个词:“茶”和“团队”。
有任何想法吗?
此致
答案 0 :(得分:9)
我会在Trie结构中加载字典单词,然后从左到右读取字符串并检查子字符串是否在trie中。如果他们是,并且有孩子,继续前进。如果它们恰好是叶子或有效单词,请添加到出现次数。
在伪代码中:
Trie dict = ... // load dictionary
Dictionary occurences = {}
for i in length(string):
j = i + 1
# think of partial as string.Substring(i, j);
while dict.hasChildren(partial):
j++
if isWord(partial):
dict[partial]++
通过这种方式,您可以保证在寻找所有可能性的同时不会遗漏比赛。
您可以通过更改j
初始化的内容或通过拒绝isWord()
方法中的短字来限制有效字词的最小长度(因此a
不会是“有效的“字”。
答案 1 :(得分:6)
Aho-Corasick string matching algorithm以字典大小的时间线性构建匹配结构,并按时间线性匹配输入文本大小+匹配数量的模式。