字符串 最小表示法 O(n)算法
2017-08-20 21:08
387 查看
求字符串的循环最小表示:
上面说的两个字符串同构的,并没有直接先求出Min(s),而是通过指针移动,当某次匹配串长时,那个位置就是Min(s)。而这里的问题就是:不是给定两个串,而是给出一个串,求它的Min(s),eg:Min(“babba”) = 4。那么由于这里并非要求两个串的同构,而是直接求它的最小表示,由于源串和目标串相同,所以处理起来既容易又需要有一些变化:我们仍然设置两个指针,i, j,其中i指向0,j指向1,仍然采用上面的滑动方式:
(1) 利用两个指针i, j。初始化时i指向0, j指向1。
(2) k = 0开始,检验s[i+k] 与 s[j+k] 对应的字符是否相等,如果相等则k++,一直下去,直到找到第一个不同,(若k试了一个字符串的长度也没找到不同,则那个位置就是最小表示位置,算法终止并返回)。则该过程中,s[i+k]
与 s[j+k]的大小关系,有三种情况:
证明的时候假设(i<j)的,无伤大雅 ;
(A). s[i+k] > s[j+k],则i滑动到i+k+1处 --- 即s1[i->i+k]不会是该循环字符串的“最小表示”的前缀。
证明如下
(B). s[i+k] < s[j+k],则j滑动到j+k+1处,原因同上。
证明如下
(C). s[i+k] = s[j+k],则 k++; if (k == len) 返回结果。
注:这里滑动方式有个小细节,若滑动后i == j,将正在变化的那个指针再+1。直到p1、p2把整个字符串都检验完毕,返回两者中小于 len 的值。
(3) 如果 k == len, 则返回i与j中的最小值
如果 i >= len 则返回j
如果 j >= len 则返回i
如果看了上一篇文章 很容易对这里的i,j 产生误会 误以为i为ans,j为比较指针
实际上这题中 i,j 都可能存有ans 两者互相更新,直到有一个更新后超过了len(包括len) 的时候 另一个即为正解
(4) 进一步的优化,例如:i要移到i+k+1时,如果i+k+1 <= p2的话,可以直接把i移到 j+1,因为,j到j+k已经检验过了该前缀比以i到i+k之间任何一个位前缀都小;j时的类似,移动到i+1。
上面说的两个字符串同构的,并没有直接先求出Min(s),而是通过指针移动,当某次匹配串长时,那个位置就是Min(s)。而这里的问题就是:不是给定两个串,而是给出一个串,求它的Min(s),eg:Min(“babba”) = 4。那么由于这里并非要求两个串的同构,而是直接求它的最小表示,由于源串和目标串相同,所以处理起来既容易又需要有一些变化:我们仍然设置两个指针,i, j,其中i指向0,j指向1,仍然采用上面的滑动方式:
(1) 利用两个指针i, j。初始化时i指向0, j指向1。
(2) k = 0开始,检验s[i+k] 与 s[j+k] 对应的字符是否相等,如果相等则k++,一直下去,直到找到第一个不同,(若k试了一个字符串的长度也没找到不同,则那个位置就是最小表示位置,算法终止并返回)。则该过程中,s[i+k]
与 s[j+k]的大小关系,有三种情况:
证明的时候假设(i<j)的,无伤大雅 ;
(A). s[i+k] > s[j+k],则i滑动到i+k+1处 --- 即s1[i->i+k]不会是该循环字符串的“最小表示”的前缀。
证明如下
(B). s[i+k] < s[j+k],则j滑动到j+k+1处,原因同上。
证明如下
(C). s[i+k] = s[j+k],则 k++; if (k == len) 返回结果。
注:这里滑动方式有个小细节,若滑动后i == j,将正在变化的那个指针再+1。直到p1、p2把整个字符串都检验完毕,返回两者中小于 len 的值。
(3) 如果 k == len, 则返回i与j中的最小值
如果 i >= len 则返回j
如果 j >= len 则返回i
如果看了上一篇文章 很容易对这里的i,j 产生误会 误以为i为ans,j为比较指针
实际上这题中 i,j 都可能存有ans 两者互相更新,直到有一个更新后超过了len(包括len) 的时候 另一个即为正解
(4) 进一步的优化,例如:i要移到i+k+1时,如果i+k+1 <= p2的话,可以直接把i移到 j+1,因为,j到j+k已经检验过了该前缀比以i到i+k之间任何一个位前缀都小;j时的类似,移动到i+1。
相关文章推荐
- 字符串最小表示法 O(n)算法
- 字符串 最小表示法 O(n)算法 【模板】
- 字符串最小表示法(1) 朴素算法
- 字符串最小表示法(1) 朴素算法
- 【转载】字符串最小表示法-O(n)算法
- 【模板】字符串算法-字符串最小表示法
- 字符串最小表示法 O(n)算法
- 字符串最小表示法 O(n)算法
- 【模板】字符串算法-字符串最小表示法
- 字符串 最小表示算法
- sdjzu 1056:字符串最小表示 贪心模拟
- HDU 3374 String Problem(字符串最小表示+KMP )
- ZOJ 1729 Hidden Password (字符串最小表示)
- 字符串的最小表示法
- 【字符串循环同构的最小表示法】
- 求输入字符串所不能表示的最小正整数
- 最小最大表示法,求环形字符串的最小最大字典树(模板)
- 每日一道算法题:输入一个表示整数的字符串,把该字符串转换成整数并输出
- BZOJ 1398: Vijos1382寻找主人 Necklace【字符串最小表示
- 字符串的最小表示法和最大表示法