题解的主要思路是通过动态规划和额外的统计数组来解决问题。首先,使用一个数组 `appear_times` 来记录每个字符在文本中出现的次数。同时,使用两个数组 `max_consec` 和 `max_gap` 分别记录每个字符连续出现的最大长度和可能通过一次交换后能达到的最大长度。动态规划数组 `dp` 的每个元素包含两个值,分别表示当前位置连续的字符长度和可能的最长交换后长度。在遍历字符串时,根据当前字符是否与前一个字符相同来更新 `dp` 数组,以及对应的 `max_consec` 和 `max_gap`。最后,根据字符的出现次数,利用 `max_consec` 和 `max_gap` 计算可能的最大长度。
时间复杂度: O(n)
空间复杂度: O(n)
class Solution:
def maxRepOpt1(self, text: str) -> int:
# 初始化字符计数器和动态规划数组
appear_times = [0 for _ in range(26)]
max_consec = [0 for _ in range(26)]
max_gap = [0 for _ in range(26)]
dp = [(1,1) for _ in range(len(text))]
dp[0] = (1,1)
appear_times[ord(text[0]) - ord('a')] += 1
max_consec[ord(text[0]) - ord('a')] = 1
for i in range(1, len(text)):
index = ord(text[i]) - ord('a')
if text[i] == text[i - 1]:
# 更新连续相同字符的统计
dp[i] = (dp[i-1][0] + 1, dp[i - 1][1] + 1)
if dp[i][0] > max_consec[index]:
max_consec[index] = dp[i][0]
if dp[i][1] > max_gap[index]:
max_gap[index] = dp[i][1]
else:
appear_times[index] += 1
if i >= 2 and text[i] == text[i - 2]:
# 考虑通过一次交换修正为更长的子串
dp[i] = (1, dp[i - 2][0] + 1)
else:
dp[i] = (1, 1)
if dp[i][0] > max_consec[index]:
max_consec[index] = dp[i][0]
if dp[i][1] > max_gap[index]:
max_gap[index] = dp[i][1]
ans = 0
for i in range(26):
if appear_times[i] > 2:
# 可以通过交换获得更长的子串
ans = max(max_gap[i] + 1, ans)
elif appear_times[i] == 2:
ans = max(ans, max_consec[i] + 1, max_gap[i])
elif appear_times[i] == 1:
ans = max(ans, max_consec[i])
return ans