摘要: 找一个字符串的最小字典排序,最小表示法返回最小字典排序首字母的下标。最小表示法的复杂度为O(n)。实现方法:(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]的关系有三种: 1).s[p1+k]>s[p2+k],p1滑动到p1+k+1处,s[p1--p1+k-1]不会是循环字符串的"最小表示"的前缀。 2). 阅读全文
posted @ 2013-08-03 23:18 yongren1zu 阅读(218) 评论(0) 推荐(0) 编辑
摘要: Manacher算法用于求回文子串,它的复杂度为O(n)。这个算法有一个很巧妙的地方,它把奇数的回文串和偶数的回文串统一起来考虑了。在相邻的两个字符之间加进一个分隔符 '#' ,串的首尾也要加。原串:abaab新串:#a#b#a#a#b#中心思想是,用一个辅助数组p记录以每个字符为中心的最长回文半径,也就是p[i]记录以s[i]字符为中心的最长回文半径。p[i]最小为1,此时回文串为s[i]本身。我们用MaxId记录在 i 之前的回文串中,延伸至最右端的位置,同时用id记录这个MaxId的id值。核心代码如下: for(i=1;ii) { ... 阅读全文
posted @ 2013-08-03 15:46 yongren1zu 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 参考博客:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html KMP算法用来匹配两个字符串,即b串是否为a的子串。 普通算法的复杂度为O(n*m),KMP算法的复杂度为O(n+m)。 用 i 计数 a 串的位置,用 j 计数 b 串的位置。 普通算法: 如果 a[i] != b[j] ,则 i 回溯,j=0。 KMP算法: KMP算法和普通算法的区别在于,KMP消除的 i 的回溯,只需确定下次匹配 j 的位置即可。在KMP算法中引入了next数组,为了确定匹配不成功时,下次匹配时 j 的位置。n... 阅读全文
posted @ 2013-08-03 15:17 yongren1zu 阅读(174) 评论(0) 推荐(0) 编辑