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

2021-08-20 20:03:43 字數 1594 閱讀 7733

回文序列(palindromic sequence, palindrome)是指正向遍歷和反向遍歷完全相同的序列,例如字串「aaaaa」顯然是乙個回文序列,又如字串「abc@cba」也是乙個回文序列。現在,我們要在乙個(字元)序列中找出最長回文子串行的長度。例如字串行"bbabcbcab",最長回文子串行是「bacbcab」(可能不唯一),它的長度是7;子串行"bbbbb"和"bbabb"雖然也是回文序列,但卻不是最長的,因此不合題意。

字元字串指的是字串中連續的n個字元;如palindrome中,pa,alind,drome等都屬於它的字串

而字元子串行指的是字串中不一定連續但先後順序一致的n個字元;如palindrome中,plind,lime屬於它的子串行,而mod,rope則不是,因為它們與字串的字元順序不一致。

對任意字串,如果頭和尾相同,那麼它的最長回文子串行一定是去頭去尾之後的部分的最長回文子串行加上頭和尾。如果頭和尾不同,那麼它的最長回文子串行是去頭的部分的最長回文子串行和去尾的部分的最長回文子串行的較長的那乙個。

str[0...n-1]是給定的字串序列,長度為n,假設f(0,n-1)表示序列str[0...n-1]的最長回文子串行的長度。

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

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

設字串為s,f(i,j)表示s[i..j]的最長回文子串行。 

狀態轉移方程如下: 

當i>j時,f(i,j)=0。 

當i=j時,f(i,j)=1。 

當i當i由於f(i,j)依賴i+1,所以迴圈計算的時候,第一維必須倒過來計算,從s.length()-1到0。 

最後,s的最長回文子串行長度為f(0, s.length()-1)。

以"bbabcbcab"為例:

(注:本程式的填表方向斜向左上,即每次從最後一行最後乙個數開始,依次向左填寫)

(時間複雜度o(n^2)),空間複雜度o(n^2))

#include #include using namespace std;

int dp[1500][1500];

int main()

}cout為進一步減小空間複雜度,我們發現計算第i行時只用到了第i+1行,這樣我們便不需要n行,只需要2行即可。

#include #include using namespace std;

int dp[2][1500];

int main()

}cout

最長回文子串行LPS

題目描述 給定乙個字串s,找到其中最長的回文子串行。可以假設s的最大長度為1000。示例 1 輸入 bbbab 輸出 4 乙個可能的最長回文子串行為 bbbb 示例 2 輸入 cbbd 輸出 2 乙個可能的最長回文子串行為 bb 經典的動態規劃問題 記 dp i j 子串 s i.j 的最長回文子串...

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

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等都屬於它的字串 而字元子串行指的是字串...