前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 1234. 替换子串得到平衡字符串(滑动窗口)

LeetCode 1234. 替换子串得到平衡字符串(滑动窗口)

作者头像
Michael阿明
发布2020-07-13 15:20:14
7050
发布2020-07-13 15:20:14
举报

1. 题目

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

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

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

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

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

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

代码语言:javascript
复制
示例 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"。
 
提示:
1 <= s.length <= 10^5
s.length 是 4 的倍数
s 中只含有 'Q', 'W', 'E', 'R' 四种字符

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/replace-the-substring-for-balanced-string 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 对所有的字符计数QWER
  • 窗口[i,j]内的字符数减去
  • 窗口外的计数满足要求,左端点右移,不满足,右端点右移
代码语言:javascript
复制
class Solution {	// c++
public:
    int balancedString(string s) {
        int n = s.size(), Q = 0, W = 0, E = 0, R = 0;
        int nt = n>>2;
        int i = 0, j, minlen = n;
        for(i = 0; i < n; ++i)
        {	//获取计数
        	if (s[i] == 'Q') Q++;
        	else if (s[i] == 'W') W++;
        	else if (s[i] == 'E') E++;
        	else R++;
        }
        if(Q==nt && W==nt && E==nt && R==nt)
        	return 0;//已平衡,满足
        for(i = 0, j = 0; j < n; ++j)
        {
        	if(Q > nt || W > nt || E > nt || R > nt)
        	{	//窗口外多了,进入窗口一个,窗口外少了,计数-1
        		if (s[j] == 'Q') Q--;
	        	else if (s[j] == 'W') W--;
	        	else if (s[j] == 'E') E--;
	        	else R--;
            }
            while(i < n && (Q <= nt && W <= nt && E <= nt && R <= nt))
        	{	//窗口外满足条件,我要尽可能的让窗口小,让左端点出去,窗口外计数+1
                minlen = min(minlen, j-i+1);
                if (s[i] == 'Q') Q++;
                else if (s[i] == 'W') W++;
                else if (s[i] == 'E') E++;
                else R++;
                i++;
            }
        }
        return minlen;
    }
};

16 ms 7.9 MB

代码语言:javascript
复制
class Solution: # py3
    def balancedString(self, s: str) -> int:
        n = len(s)
        Q = 0
        W = 0
        E = 0
        R = 0
        nt = n>>2
        for i in range(n):
            if s[i] == 'Q':
                Q += 1
            elif s[i] == 'W':
                W += 1
            elif s[i] == 'E':
                E += 1
            else:
                R += 1
        if Q==nt and W==nt and E==nt and R==nt:
            return 0;
        i = 0
        minlen = n
        for j in range(n):
            if Q > nt or W > nt or E > nt or R > nt:
            # 窗口外多了,进入窗口一个,窗口外少了,计数-1
                if s[j] == 'Q':
                    Q -= 1
                elif s[j] == 'W':
                    W -= 1
                elif s[j] == 'E':
                    E -= 1
                else:
                    R -= 1
            while i < n and (Q <= nt and W <= nt and E <= nt and R <= nt):
            # 窗口外满足条件,我要尽可能的让窗口小,让左端点出去,窗口外计数+1
                minlen = min(minlen, j-i+1)
                if s[i] == 'Q':
                    Q += 1;
                elif s[i] == 'W':
                    W += 1
                elif s[i] == 'E':
                    E += 1
                else:
                    R += 1;
                i += 1;
        return minlen

216 ms 14.3 MB

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-06-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档