1.暴力法求解
時間複雜度O(n^3)
空間複雜度O(n)
代碼:
class Solution {
public String longestPalindrome(String s) {
if(s.trim().equals("")){
return "";
}
char[] arr = s.toCharArray();
int maxlength = 0;
int minIndex = 0;
int maxIndex = 0;
for(int i=0;i<arr.length;i++){
for(int j=arr.length-1;j>i;j--){
if(arr[i]==arr[j]) {
boolean flag = true;
for(int k=1;k<=(j-i)/2;k++) {
if(arr[i+k]!=arr[j-k]) {
flag = false;
break;
}
}
if(flag == true) {
if((j-i+1)>maxlength) {
maxlength = j-i+1;
minIndex = i;
maxIndex = j;
}
}
}
}
}
return s.substring(minIndex, maxIndex+1);
}
}
2.動態規劃法求解
對於字符串str,假設dp[i,j]=1表示str[i...j]是迴文子串,那個必定存在dp[i+1,j-1]=1。這樣最長迴文子串就能分解成一系列子問題,可以利用動態規劃求解了。首先構造狀態轉移方程
上面的狀態轉移方程表示,當str[i]=str[j]時,如果str[i+1...j-1]是迴文串,則str[i...j]也是迴文串;如果str[i+1...j-1]不是迴文串,則str[i...j]不是迴文串。
初始狀態
- dp[i][i]=1
- dp[i][i+1]=1 if str[i]==str[i+1]
時間複雜度O(n^2)
空間複雜度O(n^2)
引用自https://www.cnblogs.com/mini-coconut/p/9074315.html
和https://blog.csdn.net/qq_39478237/article/details/89457230
/**
* 動態規劃法
* 時間複雜度O(n^2)
* 空間複雜度O(n^2)
*/
public static String longestPalindrome1(String s) {
if(s.trim().equals("")) {
return "";
}
char[] arr = s.toCharArray();
int maxlength = 0;
int minIndex = 0;
int maxIndex = 0;
boolean[][] dp = new boolean[arr.length][arr.length];
for(int i=0;i<arr.length;i++){ //i+1爲所找子串長度,i從0開始遞增
for(int j=0;j<arr.length-i;j++) {
dp[j][j+i] = (arr[j]==arr[j+i])&&((i<2)||dp[j+1][j+i-1]);
if(dp[j][j+i]&&maxlength<(i+1)) {
maxlength = i+1;
minIndex = j;
maxIndex = j+i;
}
}
}
return s.substring(minIndex, maxIndex+1);
}
3Manacher法