5551. 使字符串平衡的最少删除次数 (前缀和dp)

本文详细解析了LeetCode第39场双周赛B中的问题5551,该题涉及字符串处理和动态规划。通过建立前缀和动态规划数组f和g,分别表示字符串中'a'和'b'的数量,求解使字符串平衡所需的最少删除次数。博主提供了清晰的代码实现,并通过实例解释了状态转移方程,帮助读者理解解题思路。
摘要由CSDN通过智能技术生成

LeetCode第39场双周赛B:5551. 使字符串平衡的最少删除次数

在这里插入图片描述


看到说秋叶收藏集 与 这题类似(变形): LCP 19. 秋叶收藏集 (dp)


定义两个前缀和 f [ i ] f[i] f[i] and g [ i ] g[i] g[i]

f [ i ] f[i] f[i]表示将s的前i个字符变为全a的操作次数, g [ i ] g[i] g[i]类似

思路:

记录 a,b 个数的前缀和 >> 然后修改他们达成 前面都是 a ,后面都是 b 的操作次数

操 作 次 数 = 前 面 几 个 b + 后 面 几 个 a 操作次数 = 前面几个 b + 后面几个 a =b+a

状态转移: m n = M a t h . m i n ( m n , f [ i ] + ( g [ l e n ] − g [ i ] ) ) mn = Math.min(mn, f[i] + (g[len] - g[i])) mn=Math.min(mn,f[i]+(g[len]g[i]))



前缀和 dp

    public int minimumDeletions(String s) {
        int len = s.length();
        int[] f = new int[100005], g = new int[100005];

        for (int i = 1; i <= len; i++) {
            f[i] = f[i - 1];
            g[i] = g[i - 1];

            // a,b 的个数
            if(s.charAt(i - 1) == 'b') f[i]++;
            if(s.charAt(i - 1) == 'a') g[i]++;
        }

        // "aababbab"
        int mn = Integer.MAX_VALUE;
        for (int i = 0; i <= len; i++) {
            System.out.println( "前面有几个b: " + f[i] + 
            " --   后面有几个 a:" +(g[len] - g[i]) + 
            "    所以最少需要操作: " + (f[i] + (g[len] - g[i])) + " 次");

            // 操作数 = 把前面的 b 换成 a, 后面的 a 换成 b  >>  f[i] + (g[len] - g[i])
            mn = Math.min(mn, f[i] + (g[len] - g[i]));
        }


        return mn;
    }



理解:

在这里插入图片描述






ddddl 的题解: b_lc_使字符串平衡的最少删除次数(前后缀dp)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值