ABC 337 B – Extended ABC

题目分析:
    这道题就是让我们判断一个序列的排列顺序是不是:
            x个A y个B z个C(x,y,z>=0)
    比如说:A、B、C、ABC、AABC、BC都是可以的
    但:CAB、ABCAB是不可以的
思路:
    题目弄懂后就很好写代码了
    判断S中的某一个字符i是A的话那么i的前一个字符一定是A,i的后一个字符一定是A或B。
           S中的某一个字符i是B的话那么i的前一个字符一定是A或B,i的后一个字符一定是B或C。
           S中的某一个字符i是C的话那么i的前一个字符一定是B或C,i的后一个字符一定是C。
    切记:一定要判断字符i的前一个字符和字符i的后一个字符,缺一不可!!!
    易错:i是从S中第二个字符开始,倒数第二个字符结束
代码:

#include<bits/stdc++.h>
using namespace std;
string a;
int main(){
	cin>>a;
	int l=a.size();
	for(int i=1;i<l-1;i++){
		int f=1;
		if(a[i]=='A'){
			if((a[i+1]=='B'||a[i+1]=='A') && (a[i-1]=='A')){
				f=0;
			}
		}
		else if(a[i]=='B'){
			if((a[i+1]=='C'||a[i+1]=='B') && (a[i-1]=='A' || a[i-1]=='B')){
				f=0;
			}
		}
		else if(a[i]=='C'){
			if((a[i+1]=='C') && (a[i-1]=='B' || a[i-1]=='C')){
				f=0;
			}
		}
		if(f){
			cout<<"No";
			return 0;
		}	
	}
	cout<<"Yes";
	return 0;
}

然后

但是!!! 

我们会发现AC也是符合条件的,应该是出“Yes”,可是输出了“No”,所以代码需要再做改进。

字符i一定不比i的后一个字符大,不比i的前一个字符小。

所以最终代码如下:

#include<bits/stdc++.h>
using namespace std;
string a;
int main(){
	cin>>a;
	int l=a.size();
	for(int i=1;i<l-1;i++){
		int f=1;
		if(a[i]>=a[i-1] && a[i]<=a[i+1]) f=0;
		if(f){
			cout<<"No";
			return 0;
		}
	}
	cout<<"Yes";
	return 0;
}

这道题就做完了。