题意:给你一个字符串,要你构建一个a-z字符串,要求给你的字符串相邻的两个字符在你构建的字符串也相邻。
思路:一个思维模拟题,首先我们可以想到没出现过的我就按顺序输出即可,然后我们可以想到用一个二维数组,或者结构体,我们知道,char类型本来就是个值,我的代码用的二维数组b,b[i][0]的值代表i字母左边的字母,b[i][1]的值代表i字符右边的字母,两个位置就找空位放,值得注意的是不能构成环,所以可以去判断那个数,是不是在当前数的那条链上,如果在就构成环,不可以放。
代码+注释
#include<cstdio> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<cstring> #include<cmath> #define ll long long #define INF 0x3f3f3f3f using namespace std; char a[100010]; char w[10010]={"abcdefghijklmnopqrstuvwxyz"}; int b[1000][2]; int vis[1000]; int fun(int x,int y,int t)//判断y是不是在x的链上,t代表向左还是向右找 { if(t==1) { int flag=0; while(x!=0) { if(x==y) { return 0; } x=b[x][1]; } } else { while(x!=0) { if(x==y) { return 0; } x=b[x][0]; } } return 1; } int main() { int t; scanf("%d",&t); while(t--) { memset(vis,0,sizeof(vis)); memset(b,0,sizeof(b)); scanf("%s",a); int n=strlen(a); int flag=0; for(int i=0;i<n-1;i++) { if(b[a[i]][0]!=a[i+1]&&b[a[i]][1]!=a[i+1])//找空位或者已经放了 { if(b[a[i]][0]==0&&b[a[i+1]][1]==0) { if(fun(a[i],a[i+1],1)==1){//是否环 b[a[i]][0]=a[i+1];//两个都变 b[a[i+1]][1]=a[i]; } else { flag=1; } } else if(b[a[i]][1]==0&&b[a[i+1]][0]==0){ if(fun(a[i],a[i+1],2)==1) { b[a[i]][1]=a[i+1]; b[a[i+1]][0]=a[i]; } else { flag=1; } } else { flag=1; } } } if(flag==1) { printf("NO\n"); } else { printf("YES\n"); int m=0; for(int i='a';i<='z';i++)//最后输出 { if(b[i][0]==0&&b[i][1]!=0) { m=i; while(m!=0) { printf("%c",m); vis[m]=1;//标记 m=b[m][1]; } } } for(int i=0;i<26;i++)//未出现按顺序输出 { if(vis[w[i]]==0) { printf("%c",w[i]); } } printf("\n"); } } }