首页 > 试题广场 >

长度为 K 的重复字符子串

[编程题]长度为 K 的重复字符子串
  • 热度指数:6994 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给你一个由小写字母组成的长度为n的字符串 S ,找出所有长度为 k 且包含重复字符的子串,请你返回全部满足要求的子串的数目

数据范围: ,
进阶: 时间复杂度,空间复杂度
示例1

输入

"createfunonyoka",4

输出

4
示例2

输入

"yokagames",3

输出

1
示例3

输入

"yoka",4

输出

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

发表于 2023-05-18 18:24:44 回复(0)
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;
	}
}

发表于 2022-10-10 09:27:42 回复(0)
public int numKLenSubstrRepeats (String s, int k) {
        Set<Character> t=new HashSet<>();
        int c=0;
        for(int i=0;i<s.length()-k+1;i++){
            int j=i;
            while(j<i+k){
                t.add(s.charAt(j++));
            }
            if(t.size()<k)c++;
            while(!t.isEmpty()){
                t.clear();
            }
        }
        return c;
    }

发表于 2022-05-23 18:10:55 回复(1)

只知道一个滑动窗口的方法,时间复杂度为 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;
    }
}
发表于 2022-01-15 15:33:01 回复(0)
//用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;
    }

发表于 2021-09-09 15:43:52 回复(0)