2982.找出出现至少三次的最长特殊子字符串II [中等]
给你一个仅由小写英文字母组成的字符串 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 * 105
-
s
仅由小写英文字母组成。
分析:
这道题和昨天的题目一样,不过对复杂度的要求提高了,因为可以看到s的长度有明显增加。这就要求代码的复杂度尽可能小了。不过昨天的代码时间复杂度并不高,这道题依然可以AC。
不过我根据昨天的思路,今天重新敲了一遍代码,和昨天的代码略微不同 但思路大同小异。
代码实现:
class Solution:
def maximumLength(self, s: str) -> int:
dic={}
n=len(s)
cos=0
for i in range(n):
cos+=1
if i==n-1 or s[i]!=s[i+1]:
if s[i] not in dic:
dic[s[i]]=[cos]
else: dic[s[i]].append(cos)
cos=0
print(dic)
a_max=0
for j in dic.values():
j.sort(reverse=True)
j.extend([0,0])
print(j)
# if j[0]>=3:
key=max(j[0]-2,min(j[0]-1,j[1]),j[2])
if key>a_max: a_max=key
if a_max==0: return -1
return a_max
a=Solution()
b=a.maximumLength(s='aaabaa')
print(b)
总结:
昨天同样的题没有一点思路,看完解析后今天又一样的题,就应该独自代码实现,不仅可以巩固知识还可以自我检测。这串代码在时间和空间上都可以击败超越70%的Python用户,性能还是无可置疑的。