1. 程式人生 > 實用技巧 >7.22每日一題題解

7.22每日一題題解

Perfect Keyboard

涉及知識點:

  • 深搜
  • 貪心
  • 思維

solution:

  • 首先通過題面,我們可以很輕鬆的得到no的條件
  • -一個字母有兩個以上的字母和它相鄰
  • -成為一個環(這樣的必定有一個字母和它的鄰居不是相鄰的)
  • 然後我們討論一下輸出yes 的情況
  • -我們發現只要用鄰接連結串列把每個字母的鄰居存起來
  • -然後在用dfs輸出就行

std:

#include <cstdio>
#include <algorithm>
#include<iomanip>
#include <iostream>
#include <cmath>
#include <string>
#include <vector>
#include <set>
#include <queue>
#include <cstring>
#include<stack>
#include <cassert>
#include<map>


using namespace std;
typedef long long LL;

LL   n, k, m ;
LL i,j,g;
set<int> v[300];
bool st[100];
bool vis(int n ){
    return n>2?false:true;
}
void dfs(int u , int fa ){
    if(st[u]==0){
        putchar(u);
        st[u]=1 ;
    }
    for(auto &k : v[u]){
        if(k==fa)continue;
        dfs(k,u);
    }
}
int main()
{
   cin>>n;
   while(n--){
        string s;cin >>s;
        int len = s.size();
        if(len==1){
            cout<<"YES"<<endl;
            cout<<"bacdefghijklmnopqrstuvwxyz"<<endl;
            continue ;
        }
        for(int i='a';i<='z';i++){
            v[i].clear();
            st[i] = 0;
        }
        for(int i=1;i<len;i++){
            v[s[i]].insert(s[i-1]);
            v[s[i-1]].insert(s[i]);
        }
        int  cnt=0 ,pos =-1 , flag =1 ;
        for(int i='a';i<='z';i++){
            if(vis(v[i].size())==false){
               flag =0 ;break;
            }
            if(v[i].size()==1) cnt ++,pos= i;
            }
        if(!flag || cnt !=2){
            cout<<"NO"<<endl;
            continue;
        }
        cout<<"YES"<<endl;
        dfs(pos,-1);
        for(int i='a';i<='z';i++)dfs(i, -1 );
        cout<<endl;



        }



    return 0;

}