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

如题,下面说说我的思路,

我想到的算法如下:

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


欢迎大家踊跃讨论和拍砖!!

你可能感兴趣的:(算法)