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)