题目
【问题描述】
给定一个由字符'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<string>
#include<vector>
using namespace std;
int main(){
string s;
vector<int> a,b;
cin>>s;
/**********前缀和init初始化**************/
if(s[0]=='a') {
a.push_back(1);
b.push_back(0);
}else{
a.push_back(0);
b.push_back(1);
}
for(int i=1;i<s.length();i++){
if(s[i]=='a'){
a.push_back(a[i-1]+1);
b.push_back(b[i-1]);
}else{// == 'b'
a.push_back(a[i-1]);
b.push_back(b[i-1]+1);
}
}
int max=-1;//记录结果,最大值
int a_first,b_mid,a_final;//其实就是三个部分相加,
//这个题用暴力也可以做,但是拿不到满分,所以我们用前缀和来降低复杂度
/************下面遍历两个节点,可以截出三个部分作为上面的三个部分***********************/
for(int i=0;i<s.length();i++){
for(int j=i;j<s.length();j++){
a_first=a[i];//第一部分所有的a
b_mid=b[j]-b[i-1];//第二部分所有的b
a_final=a[s.length()-1]-a[j];//第三部分所有的a
if(a_first+b_mid+a_final>max){
max=a_first+b_mid+a_final;
}
}
}
cout<<max<<endl;
return 0;
}
附加:关于刚开始b【i-1】 越界会产生的结果
/*
aba
j0
b_mid -536919062
j1
b_mid -536919061
j2
b_mid -536919061
j1
b_mid1
j2
b_mid1
j2
b_mid0
max3
*/