【问题描述】
给定一个由字符’a’和字符’b’组成的字符串,可以删除若干字符,使得剩下来的字符串满足前后段为a,中间段为b(aaa…aaabbbb…bbbbaaa…aaa),区段可以没有字符(ba,ab,b,aa都是合法的),求最长剩下字符串的长度。
【输入形式】
输入为一行一个长度不超过5000的非空字符串,字符串仅由字符’a’和字符’b’组成。
【输出形式】输出为一个整数,表示符合要求的最长剩下字符串长度
【样例输入1】abba
【样例输出1】
4
【样例输入2】
bab
【样例输出2】
2
/*
思路:
总结:最终的字符串为x个a,y个b,z个a的形式,其中x、y、z为大于等于0的数。
因为删除字符a或者字符b时并不会改变其他字符的顺序,因此可以利用前缀和的思想来解决此问题。
prefixSuma[i]表示前i个字符中有多少个字符为a
prefixSumb[i]表示前i个字符中有多少个字符为b
*/
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine().trim(); // 输入字符串,trim()函数可以去掉字符串两端的空格和换行符
int[] prefixSuma = new int[s.length() + 1]; // 前缀和,prefixSuma[i]表示前i个字符中有多少个数为a
int[] prefixSumb = new int[s.length() + 1];
int maxLen = 0;
if (s.length() == 0) {
System.out.println(maxLen);;
return;
}
for (int i = 1; i <= s.length(); i++) {
prefixSuma[i] = s.charAt(i - 1) == 'a' ? prefixSuma[i - 1] + 1 : prefixSuma[i - 1];
prefixSumb[i] = s.charAt(i - 1) == 'b' ? prefixSumb[i - 1] + 1 : prefixSumb[i - 1];
}
for (int i = 0; i <= s.length(); i++) {
for (int j = i; j <= s.length(); j++) { // 注意,这里要从i开始,因为中间b字符的数目是可以为0的
int startNuma = prefixSuma[i];
int midNumb = prefixSumb[j] - prefixSumb[i];
int endNuma = prefixSuma[s.length()] - prefixSuma[j];
maxLen = Math.max(maxLen, startNuma + midNumb + endNuma);
}
}
System.out.println(maxLen); // 输出结果
}
}