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

Algorithm for finding first repeated substring of length k

有一个家庭作业我应该做,我需要帮助。我应该编写一个程序来查找长度k的第一个子串,该子串在字符串中至少重复了两次。

例如,在字符串"banana"中,有两个长度为2的重复子字符串:"an"、"na"。在这种情况下,答案是"an",因为它比"na"出现得快。

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

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

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


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

从字符索引开始提取2个字符的子字符串。

检查哈希表是否包含2个字符的子字符串。如果有,你就有答案了。

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

这很容易修改,以处理长度为k的子字符串。


将will的算法与滚动散列相结合,得到线性时间算法。


可以使用链接哈希图。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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";
}