标签:技术 回文 alt 分享 一个 img span max long
判断回文(recursive)
两个条件:
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
标签:技术 回文 alt 分享 一个 img span max long
原文地址:http://www.cnblogs.com/fanhaha/p/7157308.html