字符串最小表示
求字符串的循环最小表示: 上面说的两个字符串同构的,并没有直接先求出Min(s),而是通过指针移动,当某次匹配串长时,那个位置就是Min(s)。而这里的问题就是:不是给定两个串,而是给出一个串,求它的Min(s),eg:Min(“babba”) = 4。那么由于这里并非要求两个串的同构,而是直接求它的最小表示,由于源串和目标串相同,所以处理起来既容易又需要有一些变化:我们仍然设置两个指针,p1, p2,其中p1指向s[0],p2指向s[1],仍然采用上面的滑动方式: (1) 利用两个指针p1, p2。初始化时p1指向s[0], p2指向s[1]。 (2) k = 0开始,检验s[p1+k] 与 s[p2+k] 对应的字符是否相等,如果相等则k++,一直下去,直到找到第一个不同,(若k试了一个字符串的长度也没找到不同,则那个位置就是最小表示位置,算法终止并返回)。则该过程中,s[p1+k] 与 s[p2+k]的大小关系,有三种情况: (A). s[p1+k] > s[p2+k],则p1滑动到p1+k+1处 --- 即s1[p1->p1+k]不会 是该循环字符串的“最小表示”的前缀。 (B). s[p1+k] < s[p2+k],则p2滑动到p2+k+1处,原因同上。 (C). s[p1+k] = s[p2+k],则 k++; if (k == len) 返回结果。 注