1. 问题描述:
如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。给你一个字符串 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-longest-repeated-character-substring
2. 思路分析:
一开始的时候感觉挺难的,感觉处理起来比较复杂,但是仔细分析主要是存在以下的几种情况,比如"aaaabaa"、"aabbbbab"、"ababa'等,首先比较容易想到的是先处理中间间隔一个字符的情况,我们可以使用一个变量来存储上一个字符,在循环中发现当前的字符与上一个字符不相同的情况那么就需要检查后面的字符是否与前面的字符存在相同的情况,如果相同那么表明可以交换字符使其长度更长一点,比如"aaaba"通过交换使其更长,并且我们需要计算出字符串中各个字母出现的次数,在循环中可以进行通过当前字符在字符串中的次数与上一个字符出现的次数进行比较,假如小于了说明可以通过交换后面的字符到前面得到更长的字符,比如这种情况:"aabba",感觉这种题目主要是理清楚字符串中更长字符出现的情况进行处理即可
3. 代码如下:
class Solution:
def maxRepOpt1(self, text: str) -> int:
charCount = [0 for i in range(26)]
# 计算字符串中每一种字符出现的次数
ascii_a = ord("a")
for c in text:
charCount[ord(c) - ascii_a] += 1
# lastChar用来记录上一个出现的字符
res, count, lastChar, length = 1, 1, text[0], len(text)
for i in range(1, length):
# 当前的字符与字符串中上一个出现的字符不相同的时候就需要向后边扩展看是否能够构成更长的字符
if text[i] != lastChar:
temp = i
while temp + 1 < length and lastChar == text[temp + 1]:
temp += 1
count += 1
# 避免字符间隔的情况和aaabba可以交换到前面的情况
if charCount[ord(lastChar) - ascii_a] > count:
count += 1
res, count = max(res, count), 1
lastChar = text[i]
else: count += 1
# 最后处理一下字符串中字符可能全部相同的情况
return max(count, res)