我有一段代码,其中包含
Collection<String> tok=Arrays.asList(tokens);
HashSet<String> lookup=new HashSet<String>();
while(!lookup.containsAll(tok)&&max<N)
{
}
使用 toString() 我发现即使 HashSet 包含一个集合仍然 containsAll 方法返回 false。我在代码中使用了 remove 方法,但它从未被调用。完整的代码在 pastebin 上,这将更具可读性。
目的是获取一个输入字符串和另一个 k 个字符串,并在包含所有 k 个字符串的输入字符串中搜索最小子序列
1)从输入字符串中的索引0开始,并将前k个字符串添加到HashSet,因为这是可以包含k个不同标记的最小序列
2)之后取范围 min=0 到 max=k 并继续在位置 max 添加字符串并递增 max 直到集合包含所有标记
3)当找到所有标记时,删除字符串一个位置 min(最初为 0)并增加 min。如果删除后所有标记都不存在于 HashSet 中。将 found 设置为 false,以便在下一次迭代中重复步骤 2,以从该 min 值开始间隔
4)如果max-min小于之前的差,则新的最小子序列为min-max
输入为
This is a test. This is a programming test. This is a programming test in any language.
k=4
this
a
test
programming
输出是
tokens are [this, a, test, programming]
Increasing Max [is, test, a, this] found =false
Increasing Max [is, test, a, this] found =false
Increasing Max [is, test, a, this] found =false
Increasing Max [is, programming, test, a, this] found =false
Increasing Max [is, programming, test, a, this] found =false
Increasing Max [is, programming, test, a, this] found =false
Increasing Max [is, programming, test, a, this] found =false
Increasing Max [is, programming, test, a, this] found =false
Increasing Max [is, programming, test, a, this] found =false
Increasing Max [is, programming, test, a, this] found =false
Increasing Max [is, programming, test, a, in, this] found =false
Increasing Max [is, programming, test, any, a, in, this] found =false
Increasing Max [is, programming, test, any, a, language, in, this] found =false
No subsegment found
输出显示 remove 从未被调用,但 containsAll() 仍然返回 false,即使它包含集合中存在的所有字符串。
为什么即使 remove 从未被调用,它仍然返回 false?
即使解决了上述两个问题,也可能 HashSet 不起作用。对于像这样的输入
This is a this test.
2
this
test
由于索引 3 处的 this 不会被添加到集合中。生成的最小间隔将是 [0-4] 而不是 [3-4] 那么是否有一个集合可能包含重复值并具有 containsAll 方法或 Will我必须使用带有字符串索引的 HashMap 作为键?