我应该做一些功课,我需要帮助。我应该编写一个程序来找到长度为k的第一个子串,该子串在字符串中重复至少两次。
例如在字符串" banana"有两个长度为2的重复子串:"" ," na"。在这种情况下,答案是""因为它出现的时间早于" na"
请注意,简单的O(n ^ 2)算法没有用,因为程序的执行时间有时间限制,所以我猜它应该是线性时间。
还有一个提示:使用哈希表。
我不想要代码。我只是想让你给我一个线索,因为我不知道如何使用哈希表来做到这一点。我也应该使用特定的数据结构吗?
答案 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";
}