例题 3-6 环状序列

以后 你们可以叫我   袁大婶   没错  就是这么猛.

 

------下面附上 我的代码

/*给一个长度为n的DNA环状串,请你输出字典序最小的 那个  序列*/
/*你怎么想?         不开字符串 尽量减少时间空间复杂度   打败   刘大婶*/
/*  用两个标记变量  一个字母  然后比较 大小  比较小的 那一个储存下来   然后让比较大的那一个 ++    开始对下一个进行遍历   但是时间复杂度应该比较高  能达到n^2     */
/*CCCC*/
#include<stdio.h>
#include<string.h>
int main()
{
    int q1,q,l,t,e,i,j,m,n;
    char a[200];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",a);    //输入     DNA串
        l=strlen(a);
        m=l;
        q=0;
        q1=1;
        m--;
        while(m--)
        {
        for(e=0,i=q,j=q1;e<l;i++,j++)
        {
            if(i>=l||j>=l)//很关键的一个东西,用于实现圆环
            {
                i=i%l;
                j=j%l;
            }
            if(a[i]>a[j])         //一直都让  q  为字典序最小的首字母的开头.
            {
                q=q1;
                q1++;
                break;
            }
            if(a[i]<a[j])
            {
                q1++;
                break;
            }
        }
        if(e==l)
            q1++;
        }
        for(i=0;i<l;q++,i++)
        {
            q=q%l;
            printf("%c",a[q]);
        }
        printf("\n");
    }
}

下面附上  刘大婶的


代码并且 还有值得学习之处

#include<stdio.h>
#include<string.h>
#define maxn 105
int less(char *s,int p,int q)  //
{
    int n=strlen(s);        //测量  实际数组的长度.
    for(int i=0;i<n;i++)                 //
        if(s[(p+i)%n]!=s[(q+i)%n])          //  
        return s[(p+i)%n]<s[(q+i)%n];   //
    return 0;//相等.
}
int main()
{
    int t;
    char s[maxn];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",s);
        int ans=0;
        int n=strlen(s);
        for(int i=1;i<n;i++)
            if(less(s,i,ans))
            ans=i;
        for(int i=0;i<n;i++)
            putchar(s[(i+ans)%n]);
        putchar('\n');
    }
    return 0;
}

 

posted @ 2016-01-22 19:51  X-POWER  阅读(866)  评论(0编辑  收藏  举报