leetCode- Longest Palindromic Substring
Posted 哈哈哈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetCode- Longest Palindromic Substring相关的知识,希望对你有一定的参考价值。
判断回文(recursive)
两个条件:
- 终止条件,当字符串长度为1或0时,肯定为回文
- 当字符串s长度大于1时, s回文的条件是 s[s.begin()+1,s.end()-1]回文并且 *s.begin()==*s.end()
bool ishuiwen(string s) { if(s.size()<=1) return true; string s1=s.substr(1,s.size()-2); bool issub=ishuiwen(s1); if(*s.begin()==*(s.end()-1)&&issub==true) return true; else return false; }
string中*s.end() 是‘\\0’.
不使用递归:
bool ishuiwen2(string s) { for(int i=0;i<s.size()/2;i++) { if(s[i]!=s[s.size()-i-1]) return false; } return true; }
得到最长的子回文字符串,最简单的做法得到所有字符串是否回文,记录长度,比较得到最长的。
string longstr(string s) { bool is; int nowl=1; int longl=1; string longsub; string s1; for(int i=0;i<s.size();i++) { for(int j=i+1;j<=s.size();j++) { s1=s.substr(i,j-i); cout<<s1<<endl; is=ishuiwen2(s1); if(is) nowl=s1.size(); cout<<nowl<<endl; cout<<longl<<endl; cout<<longsub<<endl; if(nowl>longl) { longl=nowl; longsub=s1; } } } return longsub; }
要进行两次循环,时间复杂度高。O(n^3);
改进中心扩展法:
字符串可能为奇数个或偶数个,奇数个时从一个中心点扩展,偶数个时从两个中心点扩展向左右扩展。O(n^2);
string longstr2(string s) { string subl; int maxl=0; int nowl=1; int left; int right; for(int i=0;i<s.size();i++) { // if(s.size()%2==1) { left=i-1; right=i+1; nowl=1; } // else while(left>=0&&right<=s.size()&&s[left]==s[right]) { left--; right++; nowl+=2; } if(nowl>maxl) { maxl=nowl; subl=s.substr(left+1,right-left-1); cout<<nowl<<endl; cout<<subl<<endl; } { left=i; right=i+1; nowl=0; } while(left>=0&&right<=s.size()&&s[left]==s[right]) { left--; right++; nowl+=2; } if(nowl>maxl) { maxl=nowl; subl=s.substr(left+1,right-left-1); cout<<nowl<<endl; cout<<subl<<endl; } } return subl; }
以上是关于leetCode- Longest Palindromic Substring的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode409. Longest Palindrome
[Leetcode]Longest Palindromic Substring
leetcode longest consecutive sequence