给你一个由小写字母组成的长度为n的字符串 S ,找出所有长度为 k 且包含重复字符的子串,请你返回全部满足要求的子串的数目。
数据范围: ,
进阶: 时间复杂度,空间复杂度
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @param k int整型 * @return int整型 */ public int numKLenSubstrRepeats (String s, int k) { // write code here int sum=0; ArrayList<Character> list=new ArrayList<>(); //依次进行判断 for(int i=0;i+k<=s.length();i++){ //如果该截取的字符串有重复的就sum++ if(dc(s.substring(i,i+k))==true){ sum++; } } return sum; } public boolean dc(String str){ //HashSet进行查重 HashSet<Character> set=new HashSet<>(); for(int i=0;i<str.length();i++){ if(!set.contains(str.charAt(i))){ set.add(str.charAt(i)); }else{ //有重复 return true; } } //无重复 return false; } }
public class NumKLenSubstrRepeats { public int numKLenSubstrRepeats(String s, int k) { // write code here // 问题一:如何判断最后一串数字 Set<Character> set = new HashSet<>(); char[] chars = s.toCharArray(); int count = 0; for (int i = 0; i <= chars.length - k; i++) { set.add(chars[i]); for (int j = i + 1; j < i + k; j++) { if (!set.contains(chars[j])) { set.add(chars[j]); continue; } else { count++; break; } } set.clear(); } return count; } }
只知道一个滑动窗口的方法,时间复杂度为 O(n^2)
但是进阶中的 O(n) 该怎么写啊?
import java.util.*; public class Solution { public int numKLenSubstrRepeats (String s, int k) { if (k>s.length()) return 0; int l=0,r=l+k-1; int count = 0; while (r<s.length()) { if (hasSameWords(s,l++,r++)) count++; } return count; } public boolean hasSameWords(String s,int l,int r) { HashSet<Character> set = new HashSet<>(); for (int i = l; i <=r ; i++) { if (set.contains(s.charAt(i))) return true; set.add(s.charAt(i)); } return false; } }
//用hashmap特性来解决 public static int numKLenSubstrRepeats (String s, int k) { // write code here int sum = 0; int cur = 0; int end = s.length()-k+1; Map<Character,Integer> map = new HashMap<>(); while(cur < end){ for (int i = 0; i < k; i++) { map.put(s.charAt(cur+i), i); if(map.size() < k && i == k-1){ sum = sum + 1; } } map.clear();; cur++; } return sum; }