这道题是个大水题,是我太渣了,在写算法排字典序的时候忘记只要两个字符串不相等就会出比较结果这个常识。然后我就一直卡在这里。。。
这个题有一个亮点,那就是所给字符串的n种形态相互对比的时候n种字符串的转换。最开始的时候我想先生成n个字符串再排序找出字典序最小的字符串,但是意识到这个花的时间有点长,然后借鉴了刘汝佳所给的思路,设置两个字符串,一个储存初始字符串,一个储存最小字符串,然后用选择排序法的思想将第一个字符串设为最小串,然后从n个字符逐个边生成新字符串边并做判断,只要发现某个字符和对应位置上的最小链的字符不一致则刷新最小串。
后来我又对其进行优化,得到的可选处理这种问题的思路是:
用一个循环遍历整个字符串的各个字符,并以该字符为新串的基点但只调用对应的字符不生成新串,逐个对比最小串和当前串相应位置的字符,如果不同就停止比较,然后视情况刷新最小串。
下附代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
string line1, line2;
int len;
void cmp(int pos)
{
bool key = false;
//string mid = "";
int mid = pos;
for(int i = 0; i < len; i++, pos++)
{
char letter1 = line1[pos % len];
char letter2 = line2[i];
// cout << letter1 << " " << letter2 << endl;
if(letter1 < letter2)
{
key = true;
break;
}
else if(letter1 > letter2)
{
break;
}
}
if(key)
{
for(int i = 0; i < len; i++, mid++)
{
line2[i] = line1[mid % len];
}
}
}
void Test()
{
line2 = line1;
for(int i = 1; i < len; i++)
{
cmp(i);
// cout << endl;
}
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
cin >> line1;
len = line1.size();
Test();
cout << line2 << endl;
}
}