最小表示法

目录

 

解决问题

算法分析

模板


解决问题

   给出一个字符串,求与它循环同构的串中字典序最小的串。

       暴力做法:求出所有同构串,进行排序比较。

       最小表示法:因为已经知道有比这些串小的串了,将字典序大的那边指针向后跳k+1即可。

算法分析

   复杂度 O(n)

   i,j 表示两个指针,其中i指向最小表示的位置,j作为比较指针。k表示字符串从i个位置开始,和字符串从j个位置开始,它们两个相同的长度。

   思路:

  1. 定义 i ,j,k 三个指针, i = 0,j = 1,k = 0;若满足while条件则进入循环,并令t = s[(i + k) % len] - s[(j + k) % len];
  2. 若 t==0 时, k++,需要移动 k 指针,找出 s [ i + k ] !=  s [ j + k ] 的位置;
  3. 若 t < 0 时,j指针向后移;
  4. 若 t > 0 时,i指针向后移;
  5. 若 i==j  时,让 j 后移一位即可;

模板

#include
#include
using namespace std;
string s;
int Getmin() {
	int len = s.length();
	int i = 0, j = 0, k = 0, t;
	while(i>s;
	cout<

POJ 1509

你可能感兴趣的:(字符串,算法,字符串)