Longest Palindromic Substring
Posted summerkiki
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Longest Palindromic Substring相关的知识,希望对你有一定的参考价值。
求最长回文子串:
回文串是指正着读和反过来读都一样的字符串。
方法:
1. 为了统一解题方法,避免字符串长度奇偶对解题方法的影响,加入了填充字符。若原来的字符串长度为n,则新的字符串长度为2n+1。
2. pos+p[pos] 表示的是目前所有回文子串中,向右达到的最远位置。
3. 先利用对称性,找到p[i]的最小值,然后再进行搜索。
4. 注意数组不要越界!!
class Solution { public: string longestPalindrome(string s) { int pos=0; string sub=s; int maxpos=0; if(!s.size()) return sub; vector<int> p(2*s.size()+1,1); vector<char> str; for(int i=0;i<2*s.size()+1;i++) { if(i%2==0) str.push_back(‘#‘); else str.push_back(s[i/2]); } cout<<"new size:"<<str.size()<<endl; for(int i=1;i<2*s.size();i++) { if(i<p[pos]+pos) { int j=2*pos-i; p[i]=min(p[j],p[pos]+pos-i); } while(i+p[i]<2*s.size()+1&&i-p[i]>=0) { if(str[i+p[i]]==str[i-p[i]]) p[i]++; else break; } if(p[maxpos]<p[i]) maxpos=i; if(p[pos]+pos<p[i]+i) pos=i; } cout<<maxpos<<endl; int begin=(maxpos-p[maxpos]+2)/2; cout<<begin<<endl; for(int i=0;i<2*s.size()+1;i++) cout<<p[i]<<‘ ‘<<endl; sub=s.substr(begin,p[maxpos]-1); return sub; }
以上是关于Longest Palindromic Substring的主要内容,如果未能解决你的问题,请参考以下文章
5. Longest Palindromic Substring
[Leetcode]Longest Palindromic Substring
LeetCode:Longest Palindromic Substring