題目:給定乙個字串,求它的最長回文子串的長度。
思路一:採用中間法比較
/*說明:中心法求最長回文子串
時間複雜度為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,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...