求一个字符串中的最长回文序列
2012-03-02 19:46
211 查看
如题,下面说说我的思路,
我想到的算法如下:
a. 遍历字符串,找到所有相邻两个字母相同的位置(比如aa),加入到链表centers1中,找到所有隔一个字符相同的位置(比如aba),加入到centers2中,复杂度O(N);
b. 设置最大回文的长度maxLength=2和回文的起始位置start=centers1[0];
c.
遍历centers1,对每一个位置进行如下操作:
设置head和tail两个int变量,表示前后到达字符的位置,head=i-1,tail=i+2;
判断head与tail位置上的字符是否相同,相同则head--、tail++,不同则比较tail-head-1与maxLength的大小,最大值为新的maxLength,start为原值或者head+1;
d.
遍历centers2,对每一个位置进行如下操作:
设置head和tail两个int变量,表示前后到达字符的位置,head=i-1,tail=i+3;
判断head与tail位置上的字符是否相同,相同则head--、tail++,不同则比较tail-head-1与maxLength的大小,最大值为新的maxLength,start为原值或者head+1;
e. 结束对两个数组的遍历后,maxLength即为最大的回文长度,start为回文的起始位置。
分析:
步骤c和d的时间复杂度比较不好算,最简单的情况下,没有相同的相邻相同或者隔一个字符相同的情况,那c和d都不需要时间;最差情况下,所有的字符都相同(aaaaaa),或者字符串是间隔相同的(abababa,这种情况的时间复杂度略好与aaaaaa),那么c和d的复杂度就是0+1+2+...+N/2+...+2+1+0=O(N^2)。平均复杂度不知道该怎么算,因为字符串的平均布局不好处理,你有什么想法吗?
欢迎大家踊跃讨论和拍砖!!
我想到的算法如下:
a. 遍历字符串,找到所有相邻两个字母相同的位置(比如aa),加入到链表centers1中,找到所有隔一个字符相同的位置(比如aba),加入到centers2中,复杂度O(N);
b. 设置最大回文的长度maxLength=2和回文的起始位置start=centers1[0];
c.
遍历centers1,对每一个位置进行如下操作:
设置head和tail两个int变量,表示前后到达字符的位置,head=i-1,tail=i+2;
判断head与tail位置上的字符是否相同,相同则head--、tail++,不同则比较tail-head-1与maxLength的大小,最大值为新的maxLength,start为原值或者head+1;
d.
遍历centers2,对每一个位置进行如下操作:
设置head和tail两个int变量,表示前后到达字符的位置,head=i-1,tail=i+3;
判断head与tail位置上的字符是否相同,相同则head--、tail++,不同则比较tail-head-1与maxLength的大小,最大值为新的maxLength,start为原值或者head+1;
e. 结束对两个数组的遍历后,maxLength即为最大的回文长度,start为回文的起始位置。
分析:
步骤c和d的时间复杂度比较不好算,最简单的情况下,没有相同的相邻相同或者隔一个字符相同的情况,那c和d都不需要时间;最差情况下,所有的字符都相同(aaaaaa),或者字符串是间隔相同的(abababa,这种情况的时间复杂度略好与aaaaaa),那么c和d的复杂度就是0+1+2+...+N/2+...+2+1+0=O(N^2)。平均复杂度不知道该怎么算,因为字符串的平均布局不好处理,你有什么想法吗?
欢迎大家踊跃讨论和拍砖!!
相关文章推荐
- 利用Manacher算法寻找字符串中的最长回文序列(palindrome)
- 求一个字符串中,最长回文子串
- 找出一个字符串中的最长奇数回文。在控制台输入输出。
- 最长公共子串、最长公共子序列、最长回文子串、模式匹配、最大子序列--字符串问题整理
- 对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
- 求一个字符串中最长回文子串的长度(承接上一个题目)
- 给一个字符串,找到其最长的回文字串
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 求给定字符串中最长回文序列
- 求一个字符串的最长回文串
- 给定一个字符串,输出最长的重复子序列
- 判断一个字符串是否为回文,以及求一个字符串中最长回文串
- 2014百度校园招聘笔试——求一个字符串的最长回文子串
- 求一个字符串的最长重复子序列
- 找工作知识储备---数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- Rust : 求出一个字符串数组中最长的公共连续子序列
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)
- 找出一个字符串中最长的连续回文
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 一个字符串A的子串被定义成从A中顺次选出若干个字符构成的串。如A=“cdaad" ,顺次选1,3,5个字符就构成子串" cad" ,现给定两个字符串,求它们的最长共公子串。 小王对既是素数又是回文的