- ab串
【问题描述】
给定一个由字符’a’和字符’b’组成的字符串,可以删除若干字符,使得剩下来的字符串满足前后段为a,中间段为b(aaa…aaabbbb…bbbbaaa…aaa),区段可以没有字符(ba,ab,b,aa都是合法的),求最长剩下字符串的长度。
【输入形式】
输入为一行一个长度不超过5000的非空字符串,字符串仅由字符’a’和字符’b’组成。
【输出形式】
输出为一个整数,表示符合要求的最长剩下字符串长度
【样例输入1】
abba
【样例输出1】
4
【样例输入2】
bab
【样例输出2】
2
#include <iostream>
#include <vector>
using namespace std;
int main() {
string str;
cin >> str;
int len = str.length();
vector<int> numa(len, 0);
vector<int> numb(len, 0);
//前缀和
if (str[0] == 'a') numa[0] = 1;
else numb[0] = 1;
for (int i = 1; i < len; i++) {
numa[i] = (str[i] == 'a') ? numa[i - 1] + 1 : numa[i - 1];
numb[i] = (str[i] == 'b') ? numb[i - 1] + 1 : numb[i - 1];
}
//分三段计算
//以下没有考虑不存在b的情况;单独考虑
if (numb[len - 1] == 0) {
cout << numa[len - 1] << endl;
return 0;
}
int ans = 0;
int numa1 = 0, bs = 0, numa2 = 0;
for (int i = 0; i < str.length(); i++) { //b起点
for (int j = i; j < str.length(); j++) { //b终点
if (i != 0) {
numa1 = numa[i - 1];
bs = numb[j] - numb[i - 1];
}
else {
numa1 = 0;
bs = numb[j];
}
numa2 = numa[len - 1] - numa[j];
if (numa1 + bs + numa2 > ans) ans = numa1 + bs + numa2;
}
}
cout << ans << endl;
}