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"; } |