自己写的代码:
#include<stdio.h>
#include<string.h>int main(){ //总思路:1.将输入的字符串顺序变化后的字符串存储之后依次存放入一个二维数组中。 // 2.再通过比较字符串得到字典序最小的字符串。 char ans[105][105]; memset(ans,0,sizeof(ans)); scanf("%s",ans[0]); int n = 0; while(ans[0][n] != '\0') { n++; } int first = 1; int num = 0; int uvsal = 0 ; for(int i = 1 ; i<n ; i++ ) { printf("\n"); for(int j = first; j<n ; j++ ) { ans[i][uvsal] = ans[0][j]; printf("ans[%d][%d]为%c j为%d", i,uvsal,ans[i][uvsal],j); uvsal++; num++; if(j==(n-1)&&num<n) { j = -1; } if(num == n) { first++; num = 0; uvsal = 0; break; } printf("\n"); } if(first == n) break; } printf("\n"); for(int i = 1; i < n ; i++) { if(strcmp(ans[i],ans[0])<0) { strcpy(ans[0],ans[i]); } } printf("最小的字符串是%s",ans[0]); return 0;}
strcmp()函数使用注意事项:
/*string.h
当s1<s2时,返回为负数当s1==s2时,返回值= 0当s1>s2时,返回正数两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。特别注意:strcmp(const char *s1,const char * s2)这里面只能比较字符串,不能比较数字等其他形式的参数。*/
书上代码:
#include<stdio.h>
#include<string.h>
#define maxn 105
//环状s的表示法p是否比表示法q的字典序小
int less(const 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]) // i%n------当字符下标 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;}
书上代码思路:将最小字母的字典序找出(!!!还未思考清楚:如果有两个字符的字典序相同,该如何筛选?)