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"。提示:
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]
内的字符数减去 - 窗口外的计数满足要求,左端点右移,不满足,右端点右移
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){ //窗口外多了,进入窗口一个,窗口外少了,计数-1if (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)){ //窗口外满足条件,我要尽可能的让窗口小,让左端点出去,窗口外计数+1minlen = 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
class Solution: # py3def balancedString(self, s: str) -> int:n = len(s)Q = 0W = 0E = 0R = 0nt = n>>2for i in range(n):if s[i] == 'Q':Q += 1elif s[i] == 'W':W += 1elif s[i] == 'E':E += 1else:R += 1if Q==nt and W==nt and E==nt and R==nt:return 0;i = 0minlen = nfor j in range(n):if Q > nt or W > nt or E > nt or R > nt:# 窗口外多了,进入窗口一个,窗口外少了,计数-1if s[j] == 'Q':Q -= 1elif s[j] == 'W':W -= 1elif s[j] == 'E':E -= 1else:R -= 1while i < n and (Q <= nt and W <= nt and E <= nt and R <= nt):# 窗口外满足条件,我要尽可能的让窗口小,让左端点出去,窗口外计数+1minlen = min(minlen, j-i+1)if s[i] == 'Q':Q += 1;elif s[i] == 'W':W += 1elif s[i] == 'E':E += 1else:R += 1;i += 1;return minlen
216 ms 14.3 MB