题目链接:点击打开链接
字符串最小表示法:以某个小标开始字典序最小的串。
假设有两个下标i,j,表示如果从i和从j出发的字符串,有一个k表示字符串的长度,如果长度达到len,就表示找到最小的串。
s[i+k] == s[j+k]: k++
s[i+k]>s[j+k]: i=i+k+1 表示以i,到i+k为起点的字符串,都不是最小字符串的前缀。
s[i+k]<s[j+k]: j=j+k+1 同理
注意:1.i和j一定是不同的。
2.每次不等时,需要设置k为0。
#include<iostream>
#include<string>
using namespace std;
int findMin(string s)
{
int len = s.length();
int i=0,j=1,k=0;
while(i<len&&k<len&&j<len)
{
if(s[(i+k)%len]==s[(j+k)%len])
{
k++;
}
else if(s[(i+k)%len]>s[(j+k)%len])
{
i=i+k+1;
k=0;
}
else
{
j=j+k+1;
k=0;
}
if(i==j) j++;
}
return min(i,j);
}
int main()
{
int n;
string s;
cin>>n;
while(n--)
{
cin>>s;
cout<<findMin(s)+1<<endl;
}
return 0;
}