Leetcode 1653. 使字符串平衡的最少删除次数

2025/04/12

1653. 使字符串平衡的最少删除次数

给你一个字符串 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")。
class Solution:
    def minimumDeletions(self, s: str) -> int:
        '''
        f[i] 表示前i个字符变平衡的最少删除次数
        对于字符串s的前i位
        1.如果最后一位s[i-1]=='b',则他变为平衡的操作次数和 前i-1位的相同,即f[i]=f[i-1]
        2.如果s[i-1]=='a',为了不让b在a的前面,可以在前i-1位平衡的基础上删除当前的a,次数变为f[i]=f[i-1]+1
        或者将前i位中所有的b删除掉,次数变为f[i]=cntb,最终取其中次数小的,即f[i]=min(f[i-1]+1,cntb)
        递推方向:根据字符串长度,从1开始递推即可
        '''
        n=len(s)
        f=[0]*(n+1)
        cntb=0
        for i in range(1,n+1):
            # 如果最后一位是b,则不需要删
            if s[i-1]=='b':
                cntb+=1
                f[i]=f[i-1]
            else:
                # 是a的话,要么删掉a之后平衡,或者删除a前面所有的b平衡,两种情况取较小值
                f[i]=min(f[i-1]+1,cntb)
        return f[n]

Post Directory