给你一个字符串 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’ 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-deletions-to-make-string-balanced。
// 平衡的三种情况
// 1. 全是a
// 2. 全是b
// 3. 连续的a + 连续的b
/*
将s切分成左右两边,使得左边全是a,右边全是b
n = s.len
则有 n + 1 种切法 eg: s = aa 可以切割成 空|aa 、 a|a 、 aa|空
动态规划便利所有切法,找到最少删除次数
remove[i]表示前0-i最少删除次数
当s[i] = b时, 前s[i - 1]已经是aaaabbbb的平衡形式,因此remove[i] = remove[i -1]
if ( s[i] = b ) remove[i] = remove[i -1]
当s[i] = a时, 形成aaaaa的平衡,或者,按照remove[i -1]的情况删除后,再删除当前的a,也就是保持remove[i -1]形成的平衡
if ( s[i] = a ) Min( sumB , remove[i - 1] + 1)
*/
#define MIN(a, b) ((a) < (b) ? (a) : (b))
int minimumDeletions(char * s){
int len = strlen(s);
int sumB = 0;
int remove = 0;
for (int i = 0; i < len; i++) {
if (s[i] == 'b') sumB ++;
else {
remove = MIN(sumB, remove + 1);
}
}
return remove;
}