求最長回文串

2022-04-16 07:16:11 字數 2100 閱讀 4574

題目描述如下:

能立刻想到的就是爆破,先試試無腦爆破,時間複雜度o(n^3),然後毫無意外的超時了,爆破**如下:

public

string longestpalindrome(string s)

string rtstring = "";

//從第乙個字元開始,統計以每個字元開頭的能達到的最大回文子串

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

else

}int size =substr.length();

//進行最大長度記錄

if (flag && size >max) }}

if (max == 0)

return

rtstring;

}

view code

然後思考怎麼使用動態規劃,無奈本人動態規劃渣渣,於是看題解

給出定義如下

那麼

p(i, j)=(p(i+1,j−1) and si​==sj​)

p(i,i)=true

p(i, i+1) = ( s_i == s_ )p(i,i+1)=(si​==si+1​)

恍然大悟,然後開始編碼,動態規劃演算法**如下:

public

string longestpalindrome1(string s)

int length =s.length();

boolean dp = new

boolean

[length][length];

//初始化單一字元為回文串

for (int i = 0; i < dp.length; i++)

//因為dp[i][j]取決於d[i+1][j-1]的狀態,所以自底向上進行動態規劃

for (int i = length - 1; i >= 0; i--)

else }}

//遍歷dp陣列找到最長回文串

int maxlength = 0;

int maxi = 0;

int maxy = 0;

for (int i = 0; i < dp.length; i++) }}

}return s.substring(maxi, maxy + 1);

}

view code

繼續看看還有什麼演算法,看到中心擴充套件法,即以某個字元為中心向兩邊擴充套件,時間複雜度為o(n^2)**如下:

public

string longestpalindrome2(string s)

int max = 0;

int startindex = 0;

//這輪迴圈時計算

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

int jicuan =getcuan(s, left, right);

//求得回文串長度為偶數的串,返回值為

int oucuan = getcuan(s, left, right + 1);

int bigger = 0;

if (jicuan[0] > oucuan[0])

else

if (bigger >max)

}return s.substring(startindex, startindex +max);

}public

int getcuan(string s, int left, int

right)

else

}//迴圈退出之前會把left-1,right+1,所以分別要加回來和減出去

left = left + 1;

right = right - 1;

int a = ;

return

a; }

view code

求最長回文子串

求最長回文子串,大概有以下幾種方法 1 錯誤!先翻轉再求最長公共子串 例如 abcdafdcba abcd x 即原串中包含翻轉串的子串時 2 暴力 遍歷每個字串,然後判斷是否是回文子串並記錄最長資訊 時間複雜度o n 3 3 動態規劃 時間複雜度o n 2 空間複雜度o n 2 dp i j 表示...

求最長回文子串

1.第一種方法 o n 2 動態規劃,用s i j 表示從i到j是最長回文字串,用乙個table i j 記錄字串從i到j是否為回文,這樣的話,從底部向上,table i i true 另外如果s i s i 1 則table i i 1 true,然後長度從3開始,如果s i 1 s j 1 則就...

求最長回文子串

利用中心擴充套件法求最長回文子串演算法複雜度為o 待改進 manacher方法,manacher 法將所有的字串全部變成奇數個字元。思想 回文子串一定是個中心對稱的圖形,有的對稱中心是乙個字母比如abcba,有的是對稱中心是兩個字母比如abba。所以需要分開進行 程式中會有體現 利用回文子串的這一特...