字符串的最小表示法

字符串的最小表示是指,它的所有循环同构串中最小的一个

求解思路:

一个字符串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;
}

 

posted @ 2019-11-15 23:34  correct  阅读(313)  评论(0)    收藏  举报