如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。
给你一个字符串 text,你只能交换其中两个字符一次或者什么都不做,然后得到一些单字符重复的子串。返回其中最长的子串的长度。
示例 1:
输入:text = "ababa"
输出:3
示例 2:
输入:text = "aaabaaa"
输出:6
示例 3:
输入:text = "aaabbaaa"
输出:4
示例 4:
输入:text = "aaaaa"
输出:5
示例 5:
输入:text = "abcdef"
输出:1
提示:
1 <= text.length <= 20000
text 仅由小写英文字母组成。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/swap-for-maximum-repeated-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
滑动窗口找可能解。
class Solution(object):
def maxRepOpt1(self, text):
"""
:type text: str
:rtype: int
"""
if len(text) == text.count(text[0]):
return len(text)
record = collections.Counter(text)
start, end = 0, 1
cur, nxt, idx_nxt = text[0], None, 0
res = 1
while end < len(text):
if text[end] != cur :
if nxt is None:
nxt = text[end] #找到了第一个异字符
idx_nxt = end
else: #当前段已经完成
l = end - 1 - start + 1 #计算包括一个异字符的同字符子串长度
if l <= record[text[start]]: #有多的同字符可以把这个夹在中间的同字符换掉
res = max(res, l)
else:
res = max(res, l - 1) #只能用目前字串的边界同字符跟异字符交换
cur = nxt
nxt = None
start, end = idx_nxt, idx_nxt
idx_nxt = 0
if end == len(text) - 1: #到输入终点了
l = end - start + 1 #计算包括一个异字符的同字符子串长度
if l <= record[text[start]]: #有多的同字符可以把这个夹在中间的同字符换掉
res = max(res, l)
else:
res = max(res, l - 1) #只能用目前字串的边界同字符跟异字符交换
end += 1
return res