最長回文子串行LPS

2021-09-20 06:31:13 字數 2687 閱讀 1128

題目描述:

給定乙個字串s,找到其中最長的回文子串行。可以假設s的最大長度為1000。
示例 1:

輸入:"bbbab"

輸出:4

乙個可能的最長回文子串行為 "bbbb"。

示例 2:

輸入:"cbbd"

輸出:2

乙個可能的最長回文子串行為 "bb"。

經典的動態規劃問題

記:

dp[i][j] := 子串 s[i..j] 的最長回文子串行的大小
初始化:

dp[i][j] = 1    i=j //s[i..i]為單個字母

= 0 other

遞推公式:

dp[i][j] = dp[i+1][j-1] + 2             s[i]==s[j]

= max(dp[i+1][j], dp[i][j-1]) other

1.如果str的最後乙個元素和第乙個元素是相同的,則有:lps(0,n-1)=lps(1,n-2)+2;例如字串序列「aabacacba」,第乙個元素和最後乙個元素相同,其中lps(1,n-2)表示紅色部分的最長回文子串行的長度;

2.如果str的最後乙個元素和第乙個元素是不相同的,則有:lps(0,n-1)=max(lps(1,n-1),lps(0,n-2));例如字串序列「abacacb」,其中lps(1,n-1)表示去掉第一元素的子串行,lps(0,n-2)表示去掉最後乙個元素的子串行。

如果 `i+1=j` 且 `s[i]=s[j]`時,`dp[i][j] = dp[i+1][j-1] + 2` 依然成立,

因為 `i != j` 時,有 `dp[i][j] = 0`

注意,如果按照上面的 dp 定義,返回值應該是 dp[1][n] 而不是 dp[n][n]

明白狀態轉移之間的關係是理解所有動態規劃問題的關鍵,也是難點

s[i]==s[j] 時,s[i..j] 的上乙個狀態應該是 s[i+1..j-1],兩頭收縮,而不是 s[i+1..j+1] 或者其他,明白這一點是理解本題的關鍵

s[i]!=s[j] 時,s[i..j] 的上乙個狀態應該是 s[i+1..j] 或 s[i..j-1]

暫不考慮 dp 的優化

狀態更新的順序也是乙個注意點:

正確示例:

//abcdef a-a-1 ... c-c-1結束位置控制全域性

for (int j = 1; j < n; j++) // 子串結束位置

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

}return dp[0]

[n -1]

;/* 下標從 0 開始

vector> dp(n, vector(n, 0));

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

dp[i][i] = 1;

for (int i = n-1; i >= 0; i--) // 子串開始位置(>=0)

for (int j = i + 1; j < n; j++) );

}return dp[1][n];

*/}}

;int

main()

問題描述:

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為1000。
示例 1:

輸入: "babad"

輸出: "bab"

注意: "aba"也是乙個有效答案。

示例 2:

輸入: "cbbd"

輸出: "bb"

動態規劃

如果只是求最長回文子串的長度,其遞推公式與 "最長回文子串行" 完全相同

這裡需要給出具體的子串,需要重新定義 dp
定義:

dp[i][j] := 子串 s[i..j] 是否是回文子串

初始化 dp[i][j] = true i=j

= false other

遞推公式:

dp[i][j] = s[i]==s[j] j-i=1

= s[i]==s[j]&&dp[i+1][j-1] j-i>1

本題除了動態規劃的另乙個難點是如何儲存其中乙個子串
class

solution

}return s.

substr

(start, max_len);}

};

剛開始的想法是直接dfs,但會超時,也記錄一下吧

bool

ispalindrome1

(string s)

void

dfspalindrome

(string s, string &res)}}

string longestpalindrome

(string s)

最長回文子串行(LPS 滾動優化)模板

回文序列 palindromic sequence,palindrome 是指正向遍歷和反向遍歷完全相同的序列,例如字串 aaaaa 顯然是乙個回文序列,又如字串 abc cba 也是乙個回文序列。現在,我們要在乙個 字元 序列中找出最長回文子串行的長度。例如字串行 bbabcbcab 最長回文子串...

最長回文子串 最長回文子串行

1.最長回文子串行 可以不連續 include include include include using namespace std 遞迴方法,求解最長回文子串行 intlps char str,int i,int j intmain include include include using n...

最長回文子串行 回文子串行個數

主要內容 1 什麼是回文?2 字元子串和字元子串行的區別 3 最長回文子串行的思路和 4 回文子串行個數的思路和 回文指的是正讀和反讀都一樣的字串,如aba,abba等 字元字串指的是字串中連續的n個字元 如palindrome中,pa,alind,drome等都屬於它的字串 而字元子串行指的是字串...