|
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