用于查找长度为k的第一个重复子串的算法

时间:2011-05-14 22:18:28

标签: algorithm string data-structures hash substring

我应该做一些功课,我需要帮助。我应该编写一个程序来找到长度为k的第一个子串,该子串在字符串中重复至少两次。

例如在字符串" banana"有两个长度为2的重复子串:"" ," na"。在这种情况下,答案是""因为它出现的时间早于" na"

请注意,简单的O(n ^ 2)算法没有用,因为程序的执行时间有时间限制,所以我猜它应该是线性时间。

还有一个提示:使用哈希表。

我不想要代码。我只是想让你给我一个线索,因为我不知道如何使用哈希表来做到这一点。我也应该使用特定的数据结构吗?

3 个答案:

答案 0 :(得分:4)

迭代字符串(0,1,2,...)的字符索引,直到并包括倒数第二个字符的索引(即最多为strlen(str) - 2)。对于每次迭代,请执行以下操作...

从字符索引开始提取2-char子字符串。

检查哈希表是否包含2-char子字符串。如果是的话,你就得到了答案。

将每个2-char子字符串插入哈希表。

这很容易修改以应对长度为k的子串。

答案 1 :(得分:3)

将Will A的算法与rolling hash结合起来得到线性时间算法。

答案 2 :(得分:0)

您可以使用链接哈希映射。

public static String findRepeated(String s , int k){
    Map<String,Integer> map = new LinkedHashMap<String,Integer>();
    for(int i = 0 ; i < s.length() - k ; i ++){
        String temp = s.substring(i,i +k);
        if(!map.containsKey(temp)){
            map.put(temp, 1);
        }
        else{
            map.put(temp, map.get(temp) + 1);
        }
    }
    for(Map.Entry<String,Integer> entry : map.entrySet()){
        if(entry.getValue() > 1){
            return entry.getKey();
        }
    }
    return "no such value";
}
相关问题