题目分析:
这道题就是让我们判断一个序列的排列顺序是不是:
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; }
这道题就做完了。