题解: 利用hash函数去求计算子串的hash值,若子串第一次出现则将其加入到map集合中,再次出现时利用set则保存重复的子串,最后并输出
class Solution {
public List<String> findRepeatedDnaSequences(String s) { //官网自带命名方式
return finSubstr(s);
}
static List finSubstr(String s){ //寻找子串
// StringBuilder sb=new StringBuilder();
Map<Long,Integer> map=new HashMap<>(); //存放子串及其对应的hash值
Set<String> set=new HashSet<>(); //存放重复出现的子串
ArrayList<String> list=new ArrayList(); //对set集合的拷贝,官网要求返回list集合
for (int i = 0; i < s.length()-9; i++) { //遍历字符串
long chs_hash = strHash(s.substring(i, i + 10)); //计算子串的hash值,将其值作为map集合的键
if (map.keySet().contains(chs_hash)){ //子串重复出现
set.add(s.substring(i,i+10)); //set集合记录该重复子串,由于set集合的唯一性,所以重复出现的子串最多只会被添加一次
}
map.put(chs_hash,1); //子串未重复出现,则将其添加到map集合中
}
//输出set集合到list中
for (String s1 : set) { //将set集合拷贝到 list 中
list.add(s1);
}
return list;
}
static final long seed=31; //定义一个种子, 可以是 31 或者 131 这样的质数
static long strHash(String s){ //计算字符串的hash值
long hash=0;
for (int i = 0; i <s.length(); i++) {
hash=hash*seed+s.charAt(i);
}
return hash%Long.MAX_VALUE; // 取余,防止数据过大造成溢出
}