就是看在不更改各字母顺序的情况下,可以组成形如(a),(a+b),(a+b+a)的字符串的最长长度,其实就是子串拼成的a+b+a子串的最长长度
拿3个数组记录从s[0]到s[j]的符合条件的最长长度,这三个数组分别表示“a”,"ab"/"ba","aba"三种字符串
"a":只要记录字符串中“a”的个数就好了,每次遇到“a”dp[0][j]++;
"ab":是由“a”或者“ab”+b得到的,max(dp[0][j],dp[1][j]),每次遇到"b"++;
"aba":是由“ab”或者“aba”+a得到的,max(dp[1][j],dp[2][j]),每次遇到“a”++;
最后输出最长的就好了
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define LL long long
#define maxn 5005
using namespace std;
int dp[3][maxn];
int main()
{
char S[maxn];
while(cin>>S)
{
dp[0][0]=0;
dp[1][0]=0;
dp[2][0]=0;
memset(dp,0,sizeof(dp));
int len=strlen(S);
for(int i=0;i<len;i++)
{
dp[0][i+1]=dp[0][i]+(S[i]=='a');//a类型
dp[1][i+1]=max(dp[0][i],dp[1][i])+(S[i]=='b');//ab类型或者b类型
dp[2][i+1]=max(dp[1][i],dp[2][i])+(S[i]=='a');//aba类型
}
int ans;
ans=max(max(dp[0][len],dp[1][len]),dp[2][len]);
cout << ans << endl;
}
return 0;
}