1. 解题思路
这一题由于目标的子串要求只能是同一个字符组成的子串,因此,我们只需要考察所有同一字符构成的子串,然后找到其中重复了至少3次的子串即可。
显然,我们可以找到任意字符c
所组成的连续字符,然后如果最长的子串重复出现超过3次,那么显然这个字符所能构成的最大长度就是这个长度n;如果这个长度重复出现过2次,但是最大长度超过2,那么最大长度即为n-1;如果他只出现过一次,但是长度超过3,那么最大长度就是n-2与次大长度的较大值,如果长度为2,那么需要考虑长度为1的情况。
由此,虽然复杂了一点,但是分类讨论一下还是很快就能得到答案的。
需要注意的是,我们在解答当中给出的_cnt
的计数其实是错误的,不过如果只是要判断其是否大于等于3,那么这里是可以替换使用的,这里纯属偷了个懒。
2. 代码实现
给出python代码实现如下:
class Solution:
def maximumLength(self, s: str) -> int:
cnt = defaultdict(lambda: defaultdict(int))
pre, _cnt = "", 0
for ch in s:
if ch != pre:
if _cnt != 0:
cnt[pre][_cnt] += 1
pre = ch
_cnt = 1
else:
_cnt += 1
cnt[pre][_cnt] += 1
ans = -1
for items in cnt.values():
k = max(items.keys())
_cnt = 0
for i in range(k, 0, -1):
_cnt = _cnt * 2 + items[i]
if _cnt >= 3:
ans = max(ans, i)
break
return ans
提交代码评测得到:耗时338ms,占用内存23.3MB。