寒假练习——Circular Sequence

 题目大意:T个测试样例,每个测试样例给你一个字符串,该字符串是首尾连接的一个环。问将该字符串从何处断开字典序最小,输出字典序最小的排列。

AC代码1(优化):

#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[105];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",s);
        int len=strlen(s);
        int mini=0;
        for(int i=0;i<len;i++)
        {
            for(int j=0;j<len;j++)
            {
                if(s[(mini+j)%len]!=s[(i+j)%len])
                {
                    if(s[(mini+j)%len]>s[(i+j)%len])
                        mini=i;
                    break;
                }
            }
        }
        for(int i=0;i<len;i++)
            printf("%c",s[(mini+i)%len]);
        printf("\n");
    }
    return 0;
}

AC代码2(原始):

#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[105];
char S[205];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",s);
        strcpy(S,s);
        strcat(S,s);//将首尾相连变为线性
        int len=strlen(s);
        char ch='Z';
        int mark[105],index=0;
        for(int i=0;i<len;i++)//找最小
        {
            if(s[i]<ch)
                ch=s[i];
        }
        for(int i=0;i<len;i++)//记录每个最小出现位置
            if(s[i]==ch)
                mark[index++]=i;
        for(int i=1;i<index;i++)/从每个最小开始对比
        {
            int j=mark[0],k=mark[i];
            while(S[k]==S[j])
                k++,j++;
            if(S[k]<S[j])
                mark[0]=mark[i];
        }
        for(int i=mark[0];i<len;i++)
            printf("%c",s[i]);
        for(int i=0;i<mark[0];i++)
            printf("%c",s[i]);
        printf("\n");
    }
    return 0;
}
发布了26 篇原创文章 · 获赞 1 · 访问量 424

猜你喜欢

转载自blog.csdn.net/qq_45309822/article/details/104006564
今日推荐