You are given string s. Your task is to determine if the given string s contains two non-overlapping substrings "AB" and "BA" (the substrings can go in any order).
The only line of input contains a string s of length between 1 and 105 consisting of uppercase Latin letters.
Print "YES" (without the quotes), if string s contains two non-overlapping substrings "AB" and "BA", and "NO" otherwise.
ABA
NO
BACFAB
YES
AXBYBXA
NO
In the first sample test, despite the fact that there are substrings "AB" and "BA", their occurrences overlap, so the answer is "NO".
In the second sample test there are the following occurrences of the substrings: BACFAB.
In the third sample test there is no substring "AB" nor substring "BA".
题意:给定字符串s,问其中有没有不相互覆盖的“AB”和“BA”子串,如果有输出YES,否则输出NO。。。。
思路:直接贪心找。。。
代码:
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
typedef pair<int , int> P;
string s;
stack<P> sta, stb;
int main()
{
cin >> s;
int len = s.length();
for(int i = 0; i < len - 1; i++)
{
if(s[i] == 'A'&&s[i+1] == 'B') {
P pa;
pa.first = i, pa.second = i+1;
sta.push(pa);
}else if(s[i] == 'B'&&s[i+1] == 'A')
{
P pb;
pb.first = i, pb.second = i+1;
stb.push(pb);
}
}
if(sta.size() > 0&&stb.size() > 0) {
if(sta.size() > 1&&stb.size() > 1) puts("YES");
else if(sta.size() == 1&&stb.size() == 1){
P pa, pb;
pa = sta.top(); pb = stb.top();
if(pa.first != pb.second && pa.second != pb.first) puts("YES");
else puts("NO");
} else if(sta.size() == 1) {
P pa, pb1, pb2;
pa = sta.top(); pb1 = stb.top(); stb.pop(); pb2 = stb.top();
if((pa.first != pb1.second && pa.second != pb1.first)||(pa.first != pb2.second && pa.second != pb2.first)) puts("YES");
else puts("NO");
} else if(stb.size() == 1) {
P pa1, pa2, pb;
pb = stb.top(); pa1 = sta.top(); sta.pop(); pa2 = sta.top();
if((pb.first != pa1.second && pb.second != pa1.first)||(pb.first != pa2.second && pb.second != pa2.first)) puts("YES");
else puts("NO");
}
} else puts("NO");
return 0;
}