在未排序的字符串数组中查找重复项 - O(nlogn)

时间:2013-05-19 18:22:55

标签: java

我得到了String哈希值数组,例如:“123-51s-12as-dasd1-das-41c-sadasdgt-31”。我需要找出是否有任何重复。问题是,我需要在O(nlogn)中找到它们。

1)我的想法:

为此我可以使用二进制搜索算法。但二进制搜索仅适用于已排序的数字数组。所以我问:有没有办法对字符串数组进行排序?

2)我愿意接受任何其他答案。我的问题是: 如何查找未知字符串数组中的所有重复项 - nlogn。

2 个答案:

答案 0 :(得分:6)

由于时间限制为nlog(n),您可以安全地首先对数组进行排序,然后从左到右进行扫描以检查重复的字符串。

答案 1 :(得分:0)

您可以使用Set<String>并通过循环数组将字符串插入其中:遍历数组是O(n),插入是O(log(n))。如果.add()返回false,则为重复:

public Set<String> getDups(String[] hashes)
{
    Set<String> all = new HashSet<String>();
    Set<String> ret = new HashSet<String>();
    for (final String hash: hashes)
        if (!all.add(hash)) // already seen
            ret.add(hash);
    return ret;
}