首页 > 代码库 > leetCode- Longest Palindromic Substring
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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。