例题 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; }