演算法38 5. 最長迴文子串
阿新 • • 發佈:2021-12-24
leetcode的提交不知道是不是有問題,我寫的在本地跑起來比官方答案快,但是提交失敗。
我的思路
正推,字串首尾各放一指標,向中間查詢相同項,找到後開始判斷是否迴文串,當兩指標相遇判斷結果,記錄長度。並且第一個找到的迴文串肯定是最大,所以前面的指標向前繼續查詢
string longestPalindrome(string s) { int p,max; p=0;//標記最長子串的指標 max=1;//記錄最大值 for(int i=0;i<s.size()-1;i++){ for(int j=s.size()-1;j>i;j--){ bool q=0;//當找到迴文串結束j迴圈 if(s[i]==s[j]){//找到迴文串邊界,開始判斷 for(int y=i,z=j;z>=y;y++,z--){ if(s[y]!=s[z]) break; if(y==z||y==z-1)//結束判斷,記錄大小 if(j-i+1>max){ p=i; max=j-i+1; q=1; } } } if(q) j=i;//找到迴文串 } } return s.substr(p,max); }
中心擴充套件法
class Solution { public: string longestPalindrome(string s) { int len=s.size(); if(len==0||len==1) return s; int start=0;//記錄迴文子串起始位置 int end=0;//記錄迴文子串終止位置 int mlen=0;//記錄最大回文子串的長度 for(int i=0;i<len;i++) { int len1=expendaroundcenter(s,i,i);//一個元素為中心 int len2=expendaroundcenter(s,i,i+1);//兩個元素為中心 mlen=max(max(len1,len2),mlen); if(mlen>end-start+1) { start=i-(mlen-1)/2; end=i+mlen/2; } } return s.substr(start,mlen); //該函式的意思是獲取從start開始長度為mlen長度的字串 } private: int expendaroundcenter(string s,int left,int right) //計算以left和right為中心的迴文串長度 { int L=left; int R=right; while(L>=0 && R<s.length() && s[R]==s[L]) { L--; R++; } return R-L-1; } };