本题解采用哈希表记录每个字符的连续长度,从而确定是否存在符合条件的特殊子字符串。首先,初始化一个大小为26的哈希表(字典),对应于每个英文字母,用来存储该字符连续出现的长度。遍历字符串s,使用一个计数器来记录当前字符连续出现的次数。当遇到不同的字符时,将当前计数值存入相应字符的列表中,并重置计数器。遍历完成后,检查每个字符的列表,分析是否存在长度至少为3的子字符串。通过计算特定规则(如单个字符长度减2,最长两个字符长度比较等),更新可能的最长特殊子字符串长度。最后,如果没有找到符合条件的特殊子字符串,返回-1,否则返回记录的最大长度。
时间复杂度: O(n)
空间复杂度: O(n)
class Solution:
def maximumLength(self, s: str) -> int:
d = dict()
for i in range(26): # 初始化存储每个字母的长度的字典
d[i] = list()
n = len(s)
cnt = 1 # 初始化计数器
for i in range(1, n):
if s[i] == s[i-1]:
cnt += 1 # 相同字母计数增加
else:
d[ord(s[i-1])-ord('a')].append(cnt) # 不同字母时,保存当前字母的长度
cnt = 1 # 重置计数器
d[ord(s[n-1])-ord('a')].append(cnt) # 处理字符串末尾的连续字母
ans = 0 # 初始化答案
for i in range(26):
if len(d[i]) == 0 or sum(d[i]) < 3: # 如果该字母出现的总次数小于3,忽略
continue
ans = max(ans, 1) # 至少长度为1
d[i].sort() # 排序以便于处理
ans = max(ans, d[i][-1]-2) # 尝试当前长度减2的情况
if len(d[i]) > 1 and d[i][-2] >= d[i][-1]-1:
ans = max(ans, d[i][-1]-1) # 检查前两个最长的连续长度
if len(d[i]) > 2 and d[i][-3] == d[i][-1]:
ans = max(ans, d[i][-1]) # 检查前三个长度是否相等
if ans == 0: # 如果没有找到符合条件的长度
return -1 # 返回-1
return ans # 返回找到的最长特殊子字符串的长度