[LeetCode] 1100. Find K-Length Substrings With No Repeated Characters

Given a string s and an integer k, return the number of substrings in s of length k with no repeated characters.

Example 1:
Input: s = "havefunonleetcode", k = 5
Output: 6
Explanation: There are 6 substrings they are: 'havef','avefu','vefun','efuno','etcod','tcode'.

Example 2:
Input: s = "home", k = 5
Output: 0
Explanation: Notice k can be larger than the length of s. In this case, it is not possible to find any substring.

Constraints:
1 <= s.length <= 104
s consists of lowercase English letters.
1 <= k <= 104

长度为 K 的无重复字符子串。

思路

滑动窗口。

复杂度

时间O(n)
空间O(n)

代码

滑动窗口模板实现

class Solution {
    public int numKLenSubstrNoRepeats(String s, int k) {
        // corner case
        int len = s.length();
        if (len < k) {
            return 0;
        }

        // normal case
        int start = 0;
        int end = 0;
        int res = 0;
        HashSet<Character> set = new HashSet<>();
        while (end < len) {
            while (set.contains(s.charAt(end))) {
                set.remove(s.charAt(start));
                start++;
            }
            set.add(s.charAt(end));
            end++;
            if (end - start == k) {
                res++;
                set.remove(s.charAt(start));
                start++;
            }
        }
        return res;
    }
}

固定窗口模板实现

class Solution {
    public int numKLenSubstrNoRepeats(String s, int k) {
        int n = s.length();
        // corner case
        if (s.length() < k) {
            return 0;
        }

        // normal case
        int res = 0;
        HashMap<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < k; i++) {
            char c = s.charAt(i);
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
        if (map.size() == k) {
            res++;
        }

        for (int i = k; i < n; i++) {
            char c1 = s.charAt(i);
            char c2 = s.charAt(i - k);
            map.put(c2, map.get(c2) - 1);
            if (map.get(c2) == 0) {
                map.remove(c2);
            }
            map.put(c1, map.getOrDefault(c1, 0) + 1);
            if (map.size() == k) {
                res++;
            }
        }
        return res;
    }
}
// sliding window with fixed size
posted @ 2020-07-20 05:29  CNoodle  阅读(216)  评论(0编辑  收藏  举报