字符串的最小表示法
字符串的最小表示是指,它的所有循环同构串中最小的一个
求解思路:
一个字符串s的最小表示一定存在于s + s中,因为s + s包含了 s 所有的循环同构串
通过两个指针,i, j,起点分别是字符串的开头和第二个字符,即下标从0 和 1 开始
比较s[i + k] 和 s[j + k]的大小,如果从头比较到尾部都相当,说明整个字符串只有一种字符
如果不相等就从当前不相等的位置断开,比较s[i + k] 和 s[j + k]的大小,大的一定不满足条件,如果s[i + k]大,那么不仅 i 这个位置不满足条件,在 s[i] 和 s[ i + k ]之间任意一个位置开始都不满足条件,直接让下标从 i + k + 1开始
最后在长度范围内的下标就是最小表示的开始下标,从二倍的原字符串中截取长度为 len 的子串即可
#include <bits/stdc++.h>
using namespace std;
string get_min(string s){
int len = s.length();
s += s;
int i, j;
i = 0, j = 1;
int k = 0;
while (i < len && j < len){
for (k = 0; k < len; k++){
if(s[i + k] != s[j + k])break;
}
if(k == len)return s.substr(0, len);
if(s[i + k] > s[j + k]){
i = i + k + 1;
if(i == j)++i;
}
else {
j = j + k + 1;
if(j == i)++j;
}
}
return s.substr(min(i, j), len);
}
int main()
{
string s;
while (cin >> s){
cout << get_min(s) << "\n";
}
return 0;
}
本文来自博客园,作者:correct,转载请注明原文链接:https://www.cnblogs.com/correct/p/12862014.html

浙公网安备 33010602011771号