这题看了一下自己的做法,第一次使用DP O(N^2) 然后超时了。
第二次维护一个HashSet,逐步增长求解,至少也是把问题解决了,但是效率也很一般。
今天学习了一下Manacher算法,发现可以O(N),于是学习一下相关资料,实现之。 url如下。
http://www.open-open.com/lib/view/open1419150233417.html
http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html
http://blog.youkuaiyun.com/lyhvoyage/article/details/38663487
个人觉得第三个url比较不错,通俗易懂。
算法关键是从左到右扫描,途中维护 成为回文串的最右边的字母的pos (假设它对应的中心是center) ,然后计算以当前位置i为中心的回文串长度时,如果i>pos,则必须老老实实左右扫描即可,然后更新pos和center。
否则,由对称性, 2*center-pos center pos 左右应该是对称的。
然后根据2*center-pos的回文串长度 和 center的回文串长度 的大小关系(3种),分别处理即可。 在2种情况下,i的回文串长度直接可计算,只有1种情况 (2*center-pos的回文串边缘和center的回文串边缘重合时)才要进一步探索。
好算法!