目录链接:
力扣编程题-解法汇总_分享+记录-CSDN博客
GitHub同步刷题项目:
https://github.com/September26/java-algorithms
原题链接:力扣
描述:
给你一个字符串 s
,它仅包含字符 'a'
和 'b'
。
你可以删除 s
中任意数目的字符,使得 s
平衡 。当不存在下标对 (i,j)
满足 i < j
,且 s[i] = 'b'
的同时 s[j]= 'a'
,此时认为 s
是 平衡 的。
请你返回使 s
平衡 的 最少 删除次数。
示例 1:
输入:s = "aababbab" 输出:2 解释:你可以选择以下任意一种方案: 下标从 0 开始,删除第 2 和第 6 个字符("aababbab" -> "aaabbb"), 下标从 0 开始,删除第 3 和第 6 个字符("aababbab" -> "aabbbb")。
示例 2:
输入:s = "bbaaaaabb" 输出:2 解释:唯一的最优解是删除最前面两个字符。
提示:
1 <= s.length <= 105
s[i]
要么是'a'
要么是'b'
。
解题思路:
* 解题思路: * 首先,分别统计出a和b出现的次数。 * 然后从头向尾遍历,如果读到了a,自然不需要处理。 * 如果读到了b,则有两种可能: * 第一种是保留这个b,那么后面的a都要删除,则直接用a的总数减去已遍历过的即为最少删除次数。 * 第二种是删掉这个b,那么次数已删除次数+1,继续遍历。总删除次数为已删除次数+后续的最少删除次数。
代码:
public class Solution1653 {
public int minimumDeletions(String s) {
int aNum = 0;
char[] chars = s.toCharArray();
for (char c : chars) {
if (c == 'a') {
aNum++;
}
}
int readANum = 0;
int minNum = Integer.MAX_VALUE;
int deleteBNum = 0;
for (int i = 0; i < chars.length; i++) {
char aChar = chars[i];
if (aChar == 'a') {
readANum++;
continue;
}
//保留
minNum = Math.min(minNum, aNum - readANum + deleteBNum);
if (minNum == 53) {
System.out.println("");
}
//删除b
deleteBNum++;
}
minNum = Math.min(minNum, aNum - readANum + deleteBNum);
return minNum == Integer.MAX_VALUE ? 0 : minNum;
}
}