题意:在字符串中抽出一个子序列,然后和剩下的序列拼在一起,使得相同的字符是连续的。
题记:要使三个字符连续只有6种情况
{‘R’,‘G’,‘B’},{‘R’,‘B’,‘G’},
{‘G’,‘R’,‘B’},{‘G’,‘B’,‘R’},
{‘B’,‘G’,‘R’},{‘B’,‘R’,‘G’}
这样我们可以先选全部第一个字符放进第一个序列中,全部第三个字符放进第二个序列中,然后把第二个字符放在第一个序列的尾端或者第二个序列的首端,然后把第一个序列尾端和第二个序列首端连接即可。
#include<iostream>
using namespace std;
char dis[6][3] = {
{'R','G','B'},{'R','B','G'},
{'G','R','B'},{'G','B','R'},
{'B','G','R'},{'B','R','G'}
};
int main(){
string s;
cin>>s;
int len=s.size();
bool flag=false;
for(int i=0;i<6;i++){
//遍历6种情况
int sum1=0,sum2=0,l,r;
for(int j=0;j<len;j++){
if(s[j]==dis[i][0]){
sum1++;
//统计1号字符的数量
r=j;
//找到最后一个1号字符出现的位置
}
if(s[j]==dis[i][2])
sum2++;
//统计3号字符的数量
}
for(int j=0;j<len;j++){
if(s[j]==dis[i][2]){
l=j;
break;
}
//找到第一个3号字符出现的位置
}
for(int j=0;j<l;j++)
if(s[j]==dis[i][1])
sum2++;
//将l之前的2号字符放在第二个子序列的开头
for(int j=len-1;j>r;j--)
if(s[j]==dis[i][1])
sum1++;
//将r之后的2号字符放在第一个子序列的开头
if(sum1+sum2==len){
flag=true;
break;
}
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}