最容易想到的就是暴力破解,求出每乙個子串,之後判斷是不是回文,找到最長的那個。
求每乙個子串時間複雜度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,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...