G
N
I
D
A
O
L

如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。

给你一个字符串 text,你只能交换其中两个字符一次或者什么都不做,然后得到一些单字符重复的子串。返回其中最长的子串的长度。

题目链接:https://leetcode.cn/problems/swap-for-longest-repeated-character-substring/

# 解题思路

滑动窗口:

  1. 找到与当前遍历的字符相同的最长的一段 [i, j)
  2. 判断当前短能否通过交换一次变得更长,即当 cnt[chs[i] - 'a'] > j - i && (i > 0 || j < n) 时,则能长度加 1
  3. 找到这一段后面与之【相隔一个不同字符】的另一段 [j+1, k)最大长度 = min(k - i, cnt[chs[i] - 'a'])

# 执行结果

image.png

# 代码

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;
    }
}
更新于 阅读次数

😉觉得写的还不错,请我喝杯咖啡吧😁

独步凌波 微信支付

微信支付

独步凌波 支付宝

支付宝