LC.P1156[单字符重复子串的最大长度]

方法一:滑动窗口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
public int maxRepOpt1(String text) {
Map<Character, Integer> map = new HashMap<>();
int n = text.length();
// 统计各字符出现的次数
for (int i = 0; i < n; ++i) {
char c = text.charAt(i);
map.merge(c, 1, Integer::sum);
}
int ans = 0;
for (int i = 0; i < n; ) {
int j = i;
while (j < n && text.charAt(j) == text.charAt(i)) ++j;
int curCnt = j - i;

// 如果这一段长度小于该字符出现的总数,并且前面或后面有空位,则使用 curCnt + 1 更新答案
if (curCnt < map.getOrDefault(text.charAt(i), 0) && (j < n || i > 0)) {
ans = Math.max(ans, curCnt + 1);
}

// 找到这一段后面与之相隔一个不同字符的另一段 [j + 1, k),如果不存在则 k = j + 1
int k = j + 1;
while (k < n && text.charAt(k) == text.charAt(i)) ++k;
ans = Math.max(ans, Math.min(k - i, map.getOrDefault(text.charAt(i), 0)));
i = j;
}
return ans;
}
}
  • 时间复杂度:$O(n)$
  • 空间复杂度:$O(C)$,其中$C = 26$