【题目链接】
【题目大意】
一个环形字符串,输出字典序最小的表示方法。
【解题思路】
利用指针,循环比较从p位和q位(一个是当前指向的字符串开始位置,另一个是存储的目前字典序最小的字符串开始位置)开始的字母大小。
【解题代码】
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
using namespace std;
const int maxn=1e2+5;
char s[maxn];
int small(char* a,int p,int q,int len)//p是当前的起始位置,q是当前记录的字典序最小的起始位置
{
for(int i=0;i<len;i++)
{
// printf("i=%d\n",i);
if(a[(p+i)%len]==a[(q+i)%len]) continue;
if(a[(p+i)%len]<a[(q+i)%len]) return p;
if(a[(p+i)%len]>a[(q+i)%len]) return q;
}
return q;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s",s);
int min=0;
int len=strlen(s);
for(int i=0;i<len;i++)
{
min=small(s,i,min,len);
// printf("%d\n",min);
}
for(int i=0;i<len;i++)
{
printf("%c",s[(min+i)%len]);
}
printf("\n");
}
return 0;
}
【收获与反思】
学习s[(p+i)%len]这种写法,能实现数组内从尾到头的循环。