最長回文子串深度理解動態規劃

2021-10-09 12:25:11 字數 2570 閱讀 9354

例題 力扣5.最長回文子串

解法一:暴力法

首先直接分析題解要在一串字串內找到最長的回文子串,我們很容易就能想到暴力法。

我們可以列舉出所有的長度大於2的字串,然後再拿來做判斷它是否是回文子串。

這裡列舉幾點可以注意的地方

在做這種擷取字串的時候我們不能每次都把得到的字串進行擷取,這樣不僅判斷麻煩而且擷取字串的過程中也會占用時間複雜度,最好的方法就是記錄他的位置最後得到最大的值再擷取。

如用乙個 int begin 記錄開始的位置,int maxlen記錄總長度

最後用substring(begin,begin+maxlen)來進行擷取。

我們在進行判斷回文子串的時候不要每拿到乙個字串都進行比較,可以作些優化比如判斷擷取的子串長度是否大於已經拿到的最長回文子串,如果長度小於已經拿到的最大值就沒有判斷的意義

for迴圈中&&前面如果不符合則不會執行&&後面的語句

**具體分析在**中指出

class solution 

int maxlen = 1; 用於記錄最長回文子串的長度

int begin = 0; 記錄子串開始的位置

//每次都會檢查陣列下標越界,因此先轉換成字元陣列

char chararray = s.tochararray();

//通過兩次for迴圈列舉出每乙個長度大於1子串

for(int i=0; imaxlen && validpalindromic(chararray, i, j))}}

return s.substring(begin,begin+maxlen);

}//判斷回文子串從兩邊往中間遍歷,判斷兩端的字元是否相等,不相等直接false

public boolean validpalindromic(char chararray, int left, int right)

left++;

right--;

}return true;}}

解法二:動態規劃

動態規劃最難的地方就是要分析出狀態轉移量dp和狀態轉移方程

這裡我們可以嘗試用dp[i][j]來作狀態轉移量。

dp[i][j]是乙個二維陣列能用來表示子串s[i->j]是否是子串

分析:

當我們拿到了乙個dp[i][j]我們能做什麼?

可以直接判斷s[i] 是否等於 s[j].

如果s[i] != s[j] 最外圍的兩個字元都不相等那肯定不可能是回文子串了。

如果s[i] == s[j] 呢? 那我們需要接著看dp[i+1][j-1],看s[i+1]是否等於s[j-1]

我們拿幾個例子來說

比如串aba,當我們發現我們拿到這個串dp[0][2]時(dp[i][j])我們下一步就要判斷dp[i+1][j-1],但是能發現這個例子中中間只有乙個字元只要兩邊字元相等,中間這個就不需要判斷了,即(j-1)-(i+1) < 1時 == j - i < 3時只需要判斷s[i]和s[j]是否相等。

比如串abbba,當我們拿到這個串時dp[0][4]時。我們接著就要判斷dp[1][3],因為s[1]==s[3],我們又要判斷dp[2]2

通過以上總結還能發現假如我們再判斷dp[1][6]和dp[2][5]的過程中都會遇到dp[3][4]可以得出其實我們整個尋找最大回文子串的過程就是乙個填表和乙個查表的過程,這個dp二維陣列就是表,只不過只需要觀察的他上半部分

因為我們的子串是從短到長判斷的我們判斷乙個子串是否為回文子串只需要在dp[i][j]==true的基礎上判斷dp[i+1][j-1](左右邊界減一)。

具體分析在**中理解:

**

public class solution 

int maxlen = 1;

int begin = 0;

// dp[i][j] 表示 s[i, j] 是否是回文串 是為true 不是為false

boolean dp = new boolean[len][len];

char chararray = s.tochararray();

//對角線上位置都是乙個字元可以直線先判定為true

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

for (int j = 1; j < len; j++) else else

}// 只要 dp[i][j] == true 成立,就表示子串 s[i..j] 是回文,此時記錄回文長度和起始位置

if (dp[i][j] && j - i + 1 > maxlen) }}

return s.substring(begin, begin + maxlen);}}

本篇學習自力扣大佬liweiwei1419解題思路,記錄學習演算法日常。

動態規劃 最長回文子串

動態規劃 最長回文子串 題目描述 給出乙個字串s,求s的最長回文子串的長度 樣例 字串 patzjujztaccbcc 的最長回文子串為 atzjujzta 長度為9。動態規劃思想 令dp i j 表示s i 至s j 所表示的子串是否是回文子串,是則為1,不是為0。這樣根據s i 是否等於s j ...

動態規劃 最長回文子串

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 本題有很多種解法,最簡單的暴力求解,但是會超時。下面分別說明動態規劃法和中心擴散法。解法一 動態規劃法...

最長回文子串 動態規劃

給出乙個字串s,求s的最長回文子串的長度。樣例輸入 patzjujztaccbcc 輸出 9 尋找二維動態規劃表示式dp i j 如果直接用dp i j 表示子符串從s i 到s j 的最長回文子串長度無法得出遞推表示式。令dp i j 表示s i 至s j 所表示的子串是否是回文子串,是則為1,不...