最長回文子串

2021-06-29 14:58:52 字數 1228 閱讀 9290

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

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

int findlongestpalindrome1(string s)

}if(m > n)}}

return maxlen;}

回文字串的子串也是回文,比如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,j]    = p[i+1,j-1],  if(s[i]==s[j])

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

int findlongestpalindrome2(string s)

}for(int l = 3; l < len; l++)

else

ispalindrome[i][j] = 0;}}

return maxlen;}

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

但是要考慮兩種情況:

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

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

int expandaroundcenter(string s, int c1, int c2)

return (end-begin-1);  //end-begin+1-2

}int findlongestpalindrome3(string s)

return maxlen;

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

具體演算法見leetcode: 

int findlongestpalindrome4(string s)

}int maxlen = 0;

for(int i = 0; i < len; i++)

delete num;

return maxlen;}

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

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,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...