题目书P52页
#define maxn 105
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])
return s[(p + i) % n] < s[(q + i) % n];
return 0;
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%s", s);
int n = strlen(s);
int ans = 0;
for (int i = 0; i < n; i++)
if (less(s, i, ans)) ans = i;
for (int i = 0; i < n; i++)
putchar(s[(ans + i) % n]);
putchar('\n');
}
return 0;
}
此题对我来说挺难理解的。其中可以想象环状串任意取一个字符串头,然后通过main中的第一个for循环逐个进行比较。如何比较呢?即通过定义函数less。因less在if条件语句中,只有less返回值为1时才会进行ans=i。换句话说,if(less(s,i,ans)) ans = i;这句标记出了s串中字典序最小的位置,并把此位置赋值给ans。
接着又一个for循环从字典序最小位置开始putchar输出。
less函数作用为:
我们对比所取的串头,若相等,则继续进行顺时针相邻比较,若不相等,return进行s[(p+i)%n] <s[(q+i)%n]比较,如果此式为真,则返回1,为假则返回0.