最長回文子串

2021-07-29 12:24:01 字數 2290 閱讀 1385

解法1:用兩個for迴圈找出所有子串,第三個for迴圈用於判斷該子串是否為回文,是回文則且比已找到的回文串長就替換,演算法時間效率為o(n^3)

解法2就是用動態規劃,一般都是用陣列記錄嘗試過的解法結果,為後續的解法提供剪枝。

解法3:用for迴圈遍歷字串的每乙個字元,每找到乙個字元就以此為中心,往兩邊拓展,看左右字串是否相等。但是回文有兩種型別,一種為奇數,一種偶數,如下:

奇數回文:aba

偶數回文:abba

所以要分成2種情況。演算法時間效率為o(n^2)

原文:之前註冊過hihocoder,現在看到推出程式設計字串專題,有這個題目,自己寫一下。

回文是指正著讀和倒著讀,結果一些樣,比如abcba或abba。

題目是要在乙個字串中要到最長的回文子串。

最容易想到的就是暴力破解,求出每乙個子串,之後判斷是不是回文,找到最長的那個。

求每乙個子串時間複雜度o(n^2),判斷子串是不是回文o(n),兩者是相乘關係,所以時間複雜度為o(n^3)。

string findlongestpalindrome(string &s)

if(tmp1>=tmp2&&j-i>maxlength)

}if(maxlength>0

)

return s.substr(start,maxlength);//

求子串return

null;

}

回文字串的子串也是回文,比如p[i,j](表示以i開始以j結束的子串)是回文字串,那麼p[i+1,j-1]也是回文字串。這樣最長回文子串就能分解成一系列子問題了。這樣需要額外的空間o(n^2),演算法複雜度也是o(n^2)。

首先定義狀態方程和轉移方程:

p[i,j]=0表示子串[i,j]不是回文串。p[i,j]=1表示子串[i,j]是回文串。

p[i,i]=1

p[i,j]{=p[i+1,j-1],if(s[i]==s[j])

=0 ,if(s[i]!=s[j])

string findlongestpalindrome(string &s)

;

for(int i=0;i//

初始化準備

}for(int len=3;len//

子串長度

for(int i=0;i<=length-len;i++)//

子串起始位址

}if(maxlength>=2

)

return

s.substr(start,maxlength);

return

null;

}

中心擴充套件就是把給定的字串的每乙個字母當做中心,向兩邊擴充套件,這樣來找最長的子回文串。演算法複雜度為o(n^2)。

但是要考慮兩種情況:

1、像aba,這樣長度為奇數。

2、想abba,這樣長度為偶數。

string findlongestpalindrome(string &s)

j--;

k++;}}

for(int i=0;i//

長度為偶數

j--;

k++;}}

if(maxlength>0

)

return

s.substr(start,maxlength);

return

null;

}

manacher法只能解決例如aba這樣長度為奇數的回文串,對於abba這樣的不能解決,於是就在裡面新增特殊字元。我是新增了「#」,使abba變為a#b#b#a。這個演算法就是利用已有回文串的對稱性來計算的,具體演算法複雜度為o(n),我沒看出來,因為有兩個巢狀的for迴圈。

具體原理參考這裡。

測試**中我沒過濾掉「#」。

#define min(x, y) ((x)

#define max(x, y) ((x)

string findlongestpalindrome3(string

s) length=length*2-1;//

新增#後字串長度

int *rad=new

int[length]();

rad[

0]=0

;

for(int i=1,j=1,k;ik)

int max=0

;

intcenter;

for(int i=0;i)

}return s.substr(center-max,2*max+1

);}

最長回文子串 最長回文子串行

1.最長回文子串行 可以不連續 include include include include using namespace std 遞迴方法,求解最長回文子串行 intlps char str,int i,int j intmain include include include using n...

最長回文子串

描述 輸入乙個字串,求出其中最長的回文子串。子串的含義是 在原串連續出現的字串片段。回文的含義是 正著看和倒著看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出 首尾不要輸出多餘的字串 輸入字串長度大於等於1小於等於5000,且單獨佔一行 如果...

最長回文子串

輸入乙個字元,求出其中最長的回文子串。子串的含義是 在元串中連續出現的字串片段。回文的含義是 正看和倒看相同,如abba和yyxyy,在判斷時候應該忽略所有的空格和標點符號,且忽略大小寫,但輸出應該保持原樣,輸入的字元長度不超過5000,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...