-------------------以下是主题部分-------------------------------------
- 对于此题,我们可以发现s在第一个位置和p在最后一个位置对排列不会产生影响。除此之外,如果字符串中间有s和p同时出现,那么不论位置如何变化,都不能满足条件。
- 那么我们把开头的s和最后的p替换为'.',再去找s和p出现的次数,如果同时都大于0,那么我们不能构造出数列。
------------------以下是代码部分----------------------------------------
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
string s;
cin>>s;
if(s[0]=='s') s[0]='.';
if(s[n-1]=='p') s[n-1]='.';
int ts=0,tp=0;
for(int i=0;i<=n-1;i++){
if(s[i]=='s') ts++;
if(s[i]=='p') tp++;
}
if(ts&&tp) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}
---------以下是反思部分-----------------------------
- 做题时发现队首s和队尾p的特殊性,但并未做特殊处理。也没有发现除了首尾位置之外s和p不能同时出现,而是猜测s不能出现在p的右边,导致答案出错。
- 做题时还去特判了全是'.'的情况,其实对于不影响的元素不必判断,只需要找到s,p数量的特殊性即可。