【动态平衡】【U】1653. 使字符串平衡的最少删除次数

该问题是一个字符串处理问题,目标是通过删除字符使字符串达到平衡状态,即不存在相邻的不同字符。可以通过动态规划求解,维护前缀中a和b的数量,当遇到b时,删除次数不变;遇到a时,需要在删除a和保持前缀平衡的基础上取最小值作为新的删除次数。
摘要由CSDN通过智能技术生成

给你一个字符串 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值