如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。
给你一个字符串 text,你只能交换其中两个字符一次或者什么都不做,然后得到一些单字符重复的子串。返回其中最长的子串的长度。
题目链接:https://leetcode.cn/problems/swap-for-longest-repeated-character-substring/
# 解题思路
滑动窗口:
- 找到与当前遍历的字符相同的最长的一段
[i, j)
- 判断当前短能否通过交换一次变得更长,即当
cnt[chs[i] - 'a'] > j - i && (i > 0 || j < n)
时,则能长度加 1 - 找到这一段后面与之【相隔一个不同字符】的另一段
[j+1, k)
,最大长度 = min(k - i, cnt[chs[i] - 'a'])
# 执行结果
# 代码
class Solution { | |
public int maxRepOpt1(String text) { | |
char[] chs = text.toCharArray(); | |
int n = chs.length; | |
int[] cnt = new int[26]; | |
// 记录每个字符出现的次数 | |
for (char c : chs) ++cnt[c - 'a']; | |
int ret = 0; | |
int i = 0; | |
while (i < n) { | |
// 找出当前相同字符的一段 [i, j) | |
int j = i; | |
while (j < n && chs[j] == chs[i]) ++j; | |
// 当前这一段连续相同的字符串的长度 | |
int len = j - i; | |
//len < 该字符出现的总数,并且前面或后面有空位,则可以替换,即长度为 len+1 | |
if (len < cnt[chs[i] - 'a'] && (j < n || i > 0)) | |
ret = Math.max(ret, len + 1); | |
// 找到这一段后面与之【相隔一个不同字符】的另一段 [j+1, k) | |
int k = j + 1; | |
while (k < n && chs[k] == chs[i]) ++k; | |
// 最大长度不会超过该字符出现的总次数 | |
ret = Math.max(ret, Math.min(k - i, cnt[chs[i] - 'a'])); | |
// 更新 i | |
i = j; | |
} | |
return ret; | |
} | |
} |