【LeetCode1234. 替换子串得到平衡字符串】

1234. 替换子串得到平衡字符串

1.题目描述

有一个只含有 'Q', 'W', 'E', 'R' 四种字符,且长度为 n 的字符串。

假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」。

 

给你一个这样的字符串 s,请通过「替换一个子串」的方式,使原字符串 s 变成一个「平衡字符串」。

你可以用和「待替换子串」长度相同的 任何 其他字符串来完成替换。

请返回待替换子串的最小可能长度。

如果原字符串自身就是一个平衡字符串,则返回 0。

示例 1:

输入:s = "QWER"
输出:0
解释:s 已经是平衡的了。

示例 2:

输入:s = "QQWE"
输出:1
解释:我们需要把一个 'Q' 替换成 'R',这样得到的 "RQWE" (或 "QRWE") 是平衡的。

示例 3:

输入:s = "QQQW"
输出:2
解释:我们可以把前面的 "QQ" 替换成 "ER"。 

示例 4:

输入:s = "QQQQ"
输出:3
解释:我们可以替换后 3 个 'Q',使 s = "QWER"。


2.解题思路

(1)题目理解

  • 替换所给字符串中的一个最短子串,使得所给字符串为平衡字符串,即每种字符的数量均恰好出现(n/4)次。
  • 替换的是子串,因此是字符是连续的。
  • 要求连续的最短区间,首先想到利用滑动窗口。

(2)难点

  • 窗口移动的条件:窗口外的各字符数量均满足小于等于(n/4)。

3.代码实现

public int balancedString(String s) {
        int[] cnt = new int[4];
        String t = "QWER";
        int n = s.length();
        for (int i = 0; i < n; ++i) {//统计每个字符数量
            cnt[t.indexOf(s.charAt(i))]++;
        }
        int m = n / 4;
        if (cnt[0] == m && cnt[1] == m && cnt[2] == m && cnt[3] == m) {//如果开始就满足,直接返回0
            return 0;
        }
        int ans = n;
        for (int i = 0, j = 0; i < n; ++i) {//窗口右边界向右移动
            cnt[t.indexOf(s.charAt(i))]--;
            while (j <= i && cnt[0] <= m && cnt[1] <= m && cnt[2] <= m && cnt[3] <= m) {//控制窗口的左边界向右移动
                ans = Math.min(ans, i - j + 1);//取满足条件的最短子串
                cnt[t.indexOf(s.charAt(j++))]++;//缩小窗口时,恢复减去的字符
            }
        }
        return ans;
    }

力扣(LeetCode)链接: 1234. 替换子串得到平衡字符串

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值