LeetCode 1100. Find K-Length Substrings With No Repeated Characters
原题链接在这里:https://leetcode.com/problems/find-k-length-substrings-with-no-repeated-characters/
题目:
Given a string S
, return the number of substrings 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 is not possible to find any substring.
Note:
1 <= S.length <= 10^4
- All characters of S are lowercase English letters.
1 <= K <= 10^4
题解:
Ask for the number of Size K window having no repeated characters.
Have runner to point the char in S. When frequency of this char is already >0, which means it appears before, then have count of repeated characters plus 1.
If runner >= K, then decrement S.charAt(runner-K) frequency. If its frequency is > 1 before decrement, then count of repeated characters minus 1.
If runner >= K-1 and there is no repeated characters, then res++.
Time Complexity: O(n). n = S.length.
Space: O(1).
AC Java:
1 class Solution { 2 public int numKLenSubstrNoRepeats(String S, int K) { 3 if(S == null || S.length() < K){ 4 return 0; 5 } 6 7 int [] map = new int[26]; 8 int runner = 0; 9 int count = 0; 10 int res = 0; 11 while(runner < S.length()){ 12 if(map[S.charAt(runner)-'a']++ > 0){ 13 count++; 14 } 15 16 if(runner >= K){ 17 if(map[S.charAt(runner-K)-'a']-- > 1){ 18 count--; 19 } 20 } 21 22 if(runner >=K-1 && count == 0){ 23 res++; 24 } 25 26 runner++; 27 } 28 29 return res; 30 } 31 }