题目:长度为n的环形串有n种表示法,分别为从某个位置开始顺时针得到。在这些表示法中,字典序最小的称为“最小表示”。
输入一个长度为n的环形串,你的任务是输出该环形串的最小表示。
例如,CTCC的最小表示是CCCT,CGAGTCAGCT的最小表示为AGCTCGAGTC。
我的想法和代码(没有实现)
#include<stdio.h>
#include<string.h>
#define maxn 50
int main(){
char s[maxn],head[maxn];
scanf("%s",s);
char a='A';
char* find=NULL;
//找到字符串里字典序最小的符号,并标记位置
while(!find)
find=strchr(s,a++);
strncpy(head,s,find-s);
printf("%s%s",find,head);
//若存在多个,则逐渐比较下一位,直到结果不同
return 0;
}
答案代码(太妙了!!!
#include<stdio.h>
#include<string.h>
#define maxn 50
//判断表示法p是否比表示法q字典序小
int less(const char* s,int p,int q){
int n=strlen(s);
for(int i=0;i<n;i++){
if(s[(i+p)%n]!=s[(i+q)%n]){ //利用这种方法就是从p、q初始位置开始
return s[(i+p)%n]<s[(i+q)%n];
}
}
}
int main(){
int t,n,least=0;
char s[maxn];
scanf("%d",&t);
while(t--){
scanf("%s",s);
n=strlen(s);
for(int i=0;i<n;i++){
if(less(s,i,least))
least=i;
}
for(int j=0;j<n;j++)
putchar(s[(j+least)%n]);
putchar('\n');
}
return 0;
}
- 学到了string.h中的一个字符串截取函数strncpy
strncpy(dest, src, 3);
拷贝src中的前3个字符到dest中,但是要保证dest的长度>=4,不然会乱码!