题目地址:
https://leetcode.com/problems/minimum-deletions-to-make-string-balanced/
给定一个只含 a a a或 b b b的字符串 s s s,允许将其中若干字符由 a a a变为 b b b或相反。问至少变多少个字符,可以使得 s s s变为 a a a先 b b b后的模式(意思是任意一个 a a a都在任意一个 b b b之前)。只含 a a a或只含 b b b的字符串也合法。
我们只需枚举分界点即可。比如,我们枚举 s [ 0 : k ] s[0:k] s[0:k]都是 a a a,而 s [ k + 1 : l s − 1 ] s[k+1:l_s-1] s[k+1:ls−1]都是 b b b,那么只需要知道 s [ 0 : k ] s[0:k] s[0:k]里有多少个 b b b, s [ k + 1 : l s − 1 ] s[k+1:l_s-1] s[k+1:ls−1]里有多少个 a a a即可。代码如下:
public class Solution {
public int minimumDeletions(String s) {
int aCount = 0, bCount = 0;
// 先求一下总共有多少个a
for (int i = 0; i < s.length(); i++) {
aCount += s.charAt(i) == 'a' ? 1 : 0;
}
// 枚举全变为b的情况
int res = aCount;
// 接着枚举s[0 : i]全变为a,后面全变为b的情况
for (int i = 0; i < s.length(); i++) {
bCount += s.charAt(i) == 'b' ? 1 : 0;
aCount -= s.charAt(i) == 'a' ? 1 : 0;
res = Math.min(res, bCount + aCount);
}
return res;
}
}
时间复杂度 O ( l s ) O(l_s) O(ls),空间 O ( 1 ) O(1) O(1)。