• 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
    ");
            }
            else
            {
                printf("YES
    ");
                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("
    ");
            }
        }
    }
  • 相关阅读:
    .IllegalArgumentException: Mapped Statements collection does not contain 异常一例【我】
    Spring配置文件里加载路径中的通配符
    线程池使用Callable示例【我】
    使用Callable和Future接口创建线程
    Java线程池(Callable+Future模式)
    集合切割
    draw call 理解和优化
    Unity 3d导入3dMax模型 产生若干问题
    3dmax做的模型导入U3d后 当模型靠近摄像机时镂空问题
    不管多少个空格替换为一个空格
  • 原文地址:https://www.cnblogs.com/2462478392Lee/p/12321875.html
Copyright © 2020-2023  润新知