题目链接:
题目大意:
给出一个字符串,问这个字符串是否包含不重叠的“AB"和”BA“子串
题目分析:
先吐槽一下自己,这种怂题,写了一个小时,还wa了好几发,给自己鞠个躬,弱菜伤不起啊
这道题的思路就是先记录下每个"AB"的位置,和AB的总数
然后再扫一遍,每遇到一个BA,就判断左右延展一个能够构成AB,如果能那么就减1,如果减完之后得到的数>0,那么就有解,如果知道扫到最后一个BA都没有成立的情况,那么就是无解,不能更水的水题了
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define MAX 100007
using namespace std;
char s[MAX];
int a[MAX];
int b[MAX];
int cnt;
int main ( )
{
while ( ~scanf ( "%s" , s ) )
{
int len = strlen(s);
cnt = 0;
memset ( a , 0 , sizeof ( a ) );
memset ( b , 0 , sizeof ( b ) );
for ( int i = 0 ; i < len ; i++ )
{
if ( s[i] == 'A' ) a[i] = 1;
if ( s[i] == 'B' ) b[i] = 1;
}
for ( int i = 0 ; i < len ; i++ )
{
if ( s[i] != 'B' ) continue;
if ( i+1 == len ) continue;
if ( s[i+1] == 'A' ) cnt++;
}
//cout << cnt << endl;
bool flag = false;
for ( int i = 0 ; i < len ; i++ )
{
if ( s[i] != 'A' ) continue;
if ( i+1 == len ) continue;
if ( s[i+1] != 'B' ) continue;
int temp = cnt;
if ( i-1 >= 0 )
{
if ( s[i-1] == 'B' ) temp--;
//if ( s[i+1] == 'A' ) temp--;
}
if ( i+2 < len )
{
if ( s[i+2] == 'A' ) temp--;
}
if ( temp > 0 )
{
flag = true;
break;
}
}
if ( flag ) puts ("YES");
else puts ("NO" );
}
}