给你一个仅有小写字母 的字符串
表示这些字母必须是相邻的
让你输出26个字母(按照它给的规矩)
能输出的话输出YES,再把字母输出出来
不能的话输出NO
构建一个欧拉通路
所谓欧拉通路即有两个度数为1的点,其余点度数为2
一个循环扫一遍,如果存在度数大于2的点或者没有两个度数为1的点就输出NO
然后在把欧拉通路的点输出出来,最后输出剩下的
代码
#include <bits/stdc++.h>
using namespace std;
int e[30][30],u[30],book[30];
int main()
{
int t;
string s,d;
d="abcdefghijklmnopqrstuvwxyz";
cin>>t;
while(t--)
{
memset(e,0,sizeof(e));
memset(u,0,sizeof(u));
memset(book,0,sizeof(book));
cin>>s;
int n=s.size();
if(n==1)
{cout<<"YES"<<endl<<d<<endl;continue;}//这里忘了输出YES,WA了好几遍。。。。。
for(int i=0;i<n-1;i++)
{
int c=s[i]-'a';
int v=s[i+1]-'a';
if(e[c][v]==0)
{e[c][v]=1;
u[c]++;}
if(e[v][c]==0)
{e[v][c]=1;
u[v]++;}
}
int flag=1;
int op=0;
for(int i=0;i<26;i++)
{
if(u[i]>2)
{flag=0;break;}
if(u[i]==1)
{op++;}
}
if(op!=2||flag==0)
{cout<<"NO"<<endl;
continue;}
cout<<"YES"<<endl;
for(int i=0;i<26;i++)
{if(u[i]==1)
{op=i;break;}}
book[op]=1;
cout<<d[op];
while(flag==1)
{
flag=0;
for(int i=0;i<26;i++)
{
if(e[op][i]==1&&book[i]==0)
{
op=i;
flag=1;
book[i]=1;
cout<<d[i];
break;
}
}
}
for(int i=0;i<26;i++)
{
if(book[i]==0)
{cout<<d[i];}
}
cout<<endl;
}
return 0;
}