最長回文子串

2021-06-26 21:36:20 字數 1425 閱讀 1385

題目:給定乙個字串,求它的最長回文子串的長度。

思路一:採用中間法比較

/*說明:中心法求最長回文子串

時間複雜度為o(n^2)時間,空間複雜度o(1)

思路:如果一段字串是回文,那麼以某個字元為中心的字首和字尾都是相同的

反之則肯定不是回文字串,不過要注意區分奇偶

*/#include #include #include /*以low和high為中心找到最長回文字串長度*/

int centerpalindrome(char*s, int n, int low, int high)

while (low>=0 && high

思路二:採用動態規劃求解

#include #include #include /*採用動態規劃求解,考慮要求最大回文字串,如

"aba"已經是回文字串,則"xabax"必然也是回文字串

那思路有了,實現考慮用陣列記錄任意i到j是否為回文字串

table[i][i]肯定為1,那table[i][j]=table[i+1][j-1] && s[i]=s[j]

即如果從i到j是回文則s[i]和s[j]必然應該相等,且從i+1到j-1必然是回文

*/char* longestpalindrome(char* s, int n)

; char* str = null;

/*初始化table[i][i]為true*/

for (i=0; i

思路三:manacher演算法,且這個演算法求最長回文子串的時間複雜度是線性o(n)的。

#include #include #include #define min(x, y) ((x)<(y)?(x):(y))

/*說明:manacher可以將找最大回文字串的時間複雜度降低為o(n)

/*將字串s加工,如s="abc", 則t="$#a#b#c#"*/

char* preprocess(char *s, int n)

t[j] = '\0';

return t;

}/*找最大回文字串主程式*/

char* manacher(char* s, int n)

/*否則認為沒有覆蓋到i值,為預設值*/

else

/*以i為中心往兩邊擴充套件,更新p[i]的值*/

while (*(t+i-p[i]) == *(t+i+p[i]))

/*如果以i為中心的回文字串更大則更新id的值*/

if (i+p[i] > mx)

/*注意此處需要重新比較,上面比較和此處有區別*/

if (p[i] > maxlen)

}str = (char *)malloc(maxlen);

start = (mid-maxlen)/2;

end = start+maxlen;

for (i=start; i

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

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