您的位置:首页 > 其它

求一个字符串中的最长回文序列

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)。平均复杂度不知道该怎么算,因为字符串的平均布局不好处理,你有什么想法吗?

欢迎大家踊跃讨论和拍砖!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐