给你一个仅由小写英文字母组成的字符串 s
。
如果一个字符串仅由单一字符组成,那么它被称为 特殊 字符串。例如,字符串 "abc"
不是特殊字符串,而字符串 "ddd"
、"zz"
和 "f"
是特殊字符串。
返回在 s
中出现 至少三次 的 最长特殊子字符串 的长度,如果不存在出现至少三次的特殊子字符串,则返回 -1
。
子字符串 是字符串中的一个连续 非空 字符序列。
示例 1:
输入:s = "aaaa"
输出:2
解释:出现三次的最长特殊子字符串是 "aa" :子字符串 "aaaa"、"aaaa" 和 "aaaa"。
可以证明最大长度是 2 。
示例 2:
输入:s = "abcdef"
输出:-1
解释:不存在出现至少三次的特殊子字符串。因此返回 -1 。
示例 3:
输入:s = "abcaba"
输出:1
解释:出现三次的最长特殊子字符串是 "a" :子字符串 "abcaba"、"abcaba" 和 "abcaba"。
可以证明最大长度是 1 。
提示:
3 <= s.length <= 5 * 10<sup>5</sup>
s
仅由小写英文字母组成。
二分+滑动窗口
class Solution:
def maximumLength(self, s: str) -> int:
def check(x: int) -> bool:
cnt = defaultdict(int)
i = 0
while i < n:
j = i + 1
while j < n and s[j] == s[i]:
j += 1
cnt[s[i]] += max(0, j - i - x + 1)
i = j
return max(cnt.values()) >= 3
n = len(s)
l, r = 0, n+1
while l +1 < r:
mid = (l + r) >> 1
if check(mid):
l = mid
else:
r = mid
return -1 if l == 0 else l
哈希、分类讨论
class Solution:
def maximumLength(self, s: str) -> int:
groups = defaultdict(list)
cnt = 0
for i, ch in enumerate(s):
cnt += 1
if i + 1 == len(s) or ch != s[i + 1]:
groups[ch].append(cnt) # 统计连续字符长度
cnt = 0
ans = 0
for a in groups.values():
a.sort(reverse=True)
a.extend([0, 0]) # 假设还有两个空串
ans = max(ans, a[0] - 2, min(a[0] - 1, a[1]), a[2])
# 最长a[0] - 2、 次长min(a[0] - 1, a[1])、 第三长 a[2]
return ans if ans else -1