找出一个单词是否可以作为词典中单词的开头

时间:2013-01-23 14:50:21

标签: java string collections

我必须找出一个给定的单词是否可以作为字典中其他单词的开头。

我使用TreeSet实现了字典。

TreeSet字典    String startString;

问题1

最有效的方法是找出startString是否是字典中至少一个单词的起点?

创意1

我的想法是使用dictionary.subSet(startString, startStringPlusOne);

startStringPlusOne等于startString,除了最后一个字符,即字母表中的下一个字符。

示例:

startString: hom
startStringPlusOne: hon

通过这种方式,SubSet返回一个空集,这意味着string不是字典中单词的开头。

问题2

计算stringPlusOne的最有效方法是什么?

创意2

我想使用带字母字母的字符数组,并用数组中的以下字符替换string的最后一个字母。 有更有效的方法吗?

1 个答案:

答案 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"]

就速度而言,这似乎是最有效的,但却以记忆效率为代价(这可能不值得担心)。