Perfect Keyboard

题意:给你一个字符串,要你构建一个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");
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/2462478392Lee/p/12321875.html