【问题描述】
给定一个由字符'a'和字符'b'组成的字符串,可以删除若干字符,使得剩下来的字符串满足前后段为a,中间段为b(aaa....aaabbbb.....bbbbaaa.....aaa),区段可以没有字符(ba,ab,b,aa都是合法的),求最长剩下字符串的长度。
【输入形式】
输入为一行一个长度不超过5000的非空字符串,字符串仅由字符'a'和字符'b'组成。
【输出形式】
输出为一个整数,表示符合要求的最长剩下字符串长度
【样例输入1】
abba
【样例输出1】
4
【样例输入2】
bab
【样例输出2】
2
解题思路
解题方法:前缀和+双重循环遍历
题目理解: 题目要求删除一些字符,使得剩余的字符串形式为前面全是'a',中间全是'b',后面全是'a'的形式,且要求剩余字符串尽可能长。
使用前缀和数组:前缀和数组cnt
用于快速计算任意区间内'a'的数量。cnt[i]
表示原字符串中从头开始到位置i
(不包括i
)有多少个'a'。 cnt[i] = cnt[i-1] + (s.charAt(i-1) == 'a' ? 1 : 0);
计算最长字符数:对于任意的分割点i
和j
(i <= j
),可以将字符串分为三部分:
-
第一部分:
[0, i)
,这部分应全为'a',即cnt[i]
。 -
第二部分:
[i, j]
,这部分应全为'b',即j-i-(cnt[j] - cnt[i])
。 -
第三部分:
(j, len]
,这部分应全为'a',,即cnt[len] - cnt[j]
。
找到最长字符数: 通过双重循环遍历所有可能的i
和j
的组合,计算出所有情况下的最长字符数,取最大值maxLength。
输出maxLength。
Java代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
int len = s.length();
int[] cnt = new int[len+1];
for (int i = 1; i <= len; i++) {
cnt[i] = cnt[i-1] + (s.charAt(i-1) == 'a' ? 1 : 0);
}
int maxLength = Integer.MIN_VALUE;
for (int i = 0; i <= len; i++) {
for (int j = i; j <= len; j++) {
int Length = cnt[i] + (j-i-(cnt[j] - cnt[i])) + (cnt[len] - cnt[j]);
maxLength = Math.max(Length, maxLength);
}
}
System.out.println(maxLength);
scanner.close();
}
}