问题 H: 两个子串
时间限制: 1 Sec 内存限制: 128 MB
题目链接:http://acm.lsnu.edu.cn/oj/problem.php?id=2495
题目描述
给定一个字符串 S,判断是字符串 S 是否包含两个互不重叠的子串 "AB" 和 "BA"(出现的先后顺序任意)。
比如"ABCBA"就包含两个互不重叠的子串 "AB" 和 "BA",而"ABCA"则不包含。
输入
输入仅有一行,包含一个只有大写字母组成的字符串 S,长度不超过 。
输出
如果包含两个不重叠子串 "AB" 和 "BA",输出 "YES",否则输出 "NO"。
样例:
样例输入
ABA
样例输出
NO
思路:
在找到AB的条件下去找BA,或者在找到BA的条件下去找AB,这两种情况至少有一种成立,则输出YES,两种都不成立则输出NO。
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
char s[maxn];
int main()
{
scanf("%s",s);
int len=strlen(s);
int flag1=0,flag2=0,flag3=0,flag4=0;
int i=0,j=0;
for(i=0;i<len;i++)
{
if(s[i]=='A'&&s[i+1]=='B')//先找AB
{
flag1=1;
i+=2;//跳过AB
}
if(flag1&&s[i]=='B'&&s[i+1]=='A')//在找到AB情况下再找BA
{
flag2=1;
i+=2;
break;
}
}
if(flag1&&flag2)
{
printf("YES\n");
return 0;
}
for(j=0;j<len;j++)
{
if(s[j]=='B'&&s[j+1]=='A')//再先找BA
{
flag3=1;
j+=2;//跳过BA
}
if(flag3&&s[j]=='A'&&s[j+1]=='B')//在找到BA情况下找AB
{
flag4=1;
j+=2;
break;
}
}
if(flag3&&flag4)
printf("YES\n");
else
printf("NO\n");
return 0;
}
赛后题解:
# include <stdio.h>
# include <string.h>
int main() {
char str[100001] = {0}, *p = NULL;
scanf("%s", str);
if ((p = strstr(str,"BA")) && strstr(p + 2, "AB")) {
printf("YES\n");
} else if ((p = strstr(str,"AB")) && strstr(p + 2, "BA")) {
printf("YES\n");
}
else {
printf("NO\n");
}
}
关于strstr函数:
- 函数原型:char* strstr(char* str1, char* str2);
- 所属头文件:<string.h>
- 功能:判断str2是否是str1的子串。
- 返回:若str2是str1的子串,则返回str2在str1中首次出现的地址;如果str2不是str1的子串,则返回NULL。