我的用例如下:给定一个字符串,识别从字符串开头开始的所有有效单词。例如:
blueberryqqq
应该输出:
blue
blueberry
为此,我有一个使用trie<char>
. 例如,如果我的字典只包含上面的两个单词,它会是这样的:
b->l->u->e->\0
->b->e->r->r->y->\0
当我调查我的输入字符串时,拼写检查过程可以告诉我,我逐个字母是否:
- 我正在寻找一个有效的词
- 我找到了一个有效的词
- 我不在通往有效词的道路上
请注意,这些都是标志,并且两者都1
可以2
同时为真。通过这种方法,我可以一次有效地找到两者blue
,并blueberry
在到达y
. 继续这个例子,这就是我从一个字母到另一个字母时发生的事情:
b:1, l:1, u:1, e:1|2, b:1, e:1, r:1, r:1, y:2
当我看到 时1|2
,我知道“蓝色”是有效词,但我也知道要继续往下走,因为我的字典告诉我可能有更多的词。一旦我到达y
,我就停下来。非常有效,因为我对所有有效单词只访问每个字母一次,一旦字典告诉我没有必要再进一步,我就会停止拼写检查。完美的!
我的问题是我的字典树是从 /usr/share/dict/words 构建的,并且该文件不包含复数形式的“蓝莓”,即“蓝莓”,通常不会包含所有的“衍生物”的话。所以如果输入字符串是blueberriesqqq
,我只会得到blue
有效的。
如果我要使用aspell
or之类的拼写检查库hunspell
,据我所知,我需要单独对所有子字符串进行拼写检查!例如b
, bl
,blu
等。效率很低!不仅如此,我不知道什么时候停止检查。例如,我怎么知道没有任何以 开头的单词blueberriesqq
?
所以,我的问题变成了:是否有一个拼写检查库可以适应我的用例?
请注意,拼写建议不会削减它。传递blueb
给 aspell 不会返回任何以 . 开头的拼写建议blueb
。因此,即使仍有更多有效单词的可能性,我也会结束我的搜索。