|
1 | 1 | class Solution { |
2 | 2 | public int maxFreq(String s, int maxLetters, int minSize, int maxSize) { |
3 | | - int result = 0; |
4 | | - Map<String, Integer> freq = new HashMap<>(); |
| 3 | + Map<Character, Integer> m = new HashMap<>(); |
| 4 | + Map<String, Integer> substrings = new HashMap<>(); |
| 5 | + int result = 0, left = 0, right = 0; |
5 | 6 |
|
6 | | - for (int i = 0; i < s.length() - minSize + 1; i++) { |
7 | | - String str = s.substring(i, i + minSize); |
| 7 | + while (right < s.length()) { |
| 8 | + char r = s.charAt(right); |
| 9 | + m.put(r, m.getOrDefault(r, 0) + 1); |
| 10 | + ++right; |
8 | 11 |
|
9 | | - if (isValid(str, maxLetters)) { |
10 | | - freq.put(str, freq.getOrDefault(str, 0) + 1); |
11 | | - result = Math.max(result, freq.get(str)); |
| 12 | + if (right - left > minSize) { |
| 13 | + char l = s.charAt(left); |
| 14 | + m.put(l, m.get(l) - 1); |
| 15 | + if (m.get(l) == 0) { |
| 16 | + m.remove(l); |
| 17 | + } |
| 18 | + ++left; |
12 | 19 | } |
13 | | - } |
14 | | - |
15 | | - return result; |
16 | | - } |
17 | 20 |
|
18 | | - private boolean isValid(String s, int maxLetters) { |
19 | | - Set<Character> set = new HashSet<>(); |
20 | | - |
21 | | - for (char c : s.toCharArray()) { |
22 | | - set.add(c); |
| 21 | + if (m.size() <= maxLetters && right - left >= minSize) { |
| 22 | + String substr = s.substring(left, right); |
| 23 | + substrings.put(substr, substrings.getOrDefault(substr, 0) + 1); |
| 24 | + result = Math.max(result, substrings.get(substr)); |
| 25 | + } |
23 | 26 | } |
24 | 27 |
|
25 | | - return set.size() <= maxLetters; |
| 28 | + return result; |
26 | 29 | } |
27 | 30 | } |
0 commit comments