给你一个长度为
n
下标从 0 开始的字符串blocks
,blocks[i]
要么是'W'
要么是'B'
,表示第i
块的颜色。字符'W'
和'B'
分别表示白色和黑色。给你一个整数
k
,表示想要 连续 黑色块的数目。每一次操作中,你可以选择一个白色块将它 涂成 黑色块。
请你返回至少出现 一次 连续
k
个黑色块的 最少 操作次数。
示例 :
输入:blocks = "WBWBBBW", k = 2 输出:0 解释: 不需要任何操作,因为已经有 2 个连续的黑块。 所以我们返回 0 。
提示:
n == blocks.length
1 <= n <= 100
blocks[i]
要么是'W'
,要么是'B'
。1 <= k <= n
比较简单的解法:
class Solution {
public int minimumRecolors(String blocks, int k) {
char[] cs = blocks.toCharArray();
int border = cs.length - k;
int ans = Integer.MAX_VALUE;
for(int i = 0; i <= border; i++){
int temp = 0;
for(int j = i; j < k + i; j++){
if(cs[j] == 'W'){
temp++;
}
}
if(temp < ans){
ans = temp;
}
}
return ans;
}
}
遍历数组,每次取k个数,这k个数中'W'字符的数量即为需要操作的次数temp,每次遍历后与ans进行比较,得出最小的temp即为答案。
上述做法在循环上可以加以优化。
class Solution {
public int minimumRecolors(String blocks, int k) {
char[] cs = blocks.toCharArray();
int curWhiteCount = 0;
for(int i = 0; i < k; i++){
if(cs[i] == 'W'){
curWhiteCount++;
}
}
int minOpsCount = curWhiteCount;
for(int i = k; i < cs.length; i++){
if(cs[i] == 'W'){
curWhiteCount++;
}
if(cs[i - k] == 'W'){
curWhiteCount--;
}
if(curWhiteCount < minOpsCount){
minOpsCount = curWhiteCount;
}
}
return minOpsCount;
}
}