我必须找出一个给定的单词是否可以作为字典中其他单词的开头。
我使用TreeSet实现了字典。
TreeSet字典 String startString;
问题1
最有效的方法是找出startString
是否是字典中至少一个单词的起点?
创意1
我的想法是使用dictionary.subSet(startString, startStringPlusOne);
startStringPlusOne
等于startString
,除了最后一个字符,即字母表中的下一个字符。
示例:
startString: hom
startStringPlusOne: hon
通过这种方式,SubSet
返回一个空集,这意味着string
不是字典中单词的开头。
问题2
计算stringPlusOne的最有效方法是什么?
创意2
我想使用带字母字母的字符数组,并用数组中的以下字符替换string
的最后一个字母。
有更有效的方法吗?
答案 0 :(得分:1)
如果记忆不是一个问题,我会想要存储两个词典。你把你的话放到另一个,你把你的话开始。
1)
["aardvark", "banana", "band"]
2)
{
"aardvar" => 1,
"aardva" => 1,
"aardv" => 1,
"aard" => 1,
"aar" => 1,
"aa" => 1,
"a" => 1,
"banan" => 1,
"bana" => 1,
"ban" => 2,
"ba" => 2,
"b" => 2
}
所以问题的答案“有没有以'禁令'开头的话?”是“是的,有2个”。你的问题并没有说明是否有必要找出那些是什么词。
如果您需要从字典中删除单词,则计数才真正有用。如果是这样,您将需要递减计数并在它们达到0时删除密钥。如果您不需要这样做,那么您不需要存储该数字。
如果您需要回答“哪个词以'禁止'开头?”的问题,那么您需要存储对这些词的引用而不仅仅是计数,例如
"ban" => ["banana", "band"]
就速度而言,这似乎是最有效的,但却以记忆效率为代价(这可能不值得担心)。