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

2021-08-14 18:19:18 字數 2303 閱讀 9337

主要內容:

1、什麼是回文?

2、字元子串和字元子串行的區別

3、最長回文子串行的思路和**

4、回文子串行個數的思路和**

回文指的是正讀和反讀都一樣的字串,如aba,abba等

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

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

給定字串,求它的最長回文子串行長度。回文子串行反轉字元順序後仍然與原序列相同。例如字串abcdfcba中,最長回文子串行長度為7,abcdcba或abcfcba。

動態規劃思想

對於任意字串,如果頭尾字元相同,那麼字串的最長子序列等於去掉首尾的字串的最長子序列加上首尾;如果首尾字元不同,則最長子序列等於去掉頭的字串的最長子序列和去掉尾的字串的最長子序列的較大者。

因此動態規劃的狀態轉移方程為:

設字串為str,長度為n,p[i][j]表示第i到第j個字元間的子串行的個數(i<=j),

則:狀態初始條件:dp[i][i]=1 (i=0:n-1)

狀態轉移方程:dp[i][j]=dp[i+1][j-1] + 2  if(str[i]==str[j])

dp[i][j]=max(dp[i+1][j],dp[i][j-1])  if (str[i]!=str[j])

以下**中的兩層迴圈變數i,j的順序可以改變,但必須滿足i<=j的條件。

計算dp[i][j]時需要計算dp[i+1][*]或dp[*][j-1],因此i應該從大到小,即遞減;j應該從小到大,即遞增。

#include #include 

using

namespace

std;

int longestpalindromesubsequence1(string

str)

}return dp[0][n-1];}

int longestpalindromesubsequence2(string

str)

}return dp[0][n-1];}

intmain()

return0;

}

給定字串,求它的回文子串行個數。回文子串行反轉字元順序後仍然與原序列相同。例如字串aba中,回文子串行為"a", "a", "aa", "b", "aba",共5個。內容相同位置不同的子串行算不同的子串行。

動態規劃思想

對於任意字串,如果頭尾字元不相等,則字串的回文子串行個數就等於去掉頭的字串的回文子串行個數+去掉尾的字串的回文子串行個數-去掉頭尾的字串的回文子串行個數

;如果頭尾字元相等,那麼除了上述的子串行個數之外,還要加上首尾相等時新增的子串行個數,1+去掉頭尾的字串的回文子串行個數

,1指的是加上頭尾組成的回文子串行,如aa,bb等。

因此動態規劃的狀態轉移方程為:

設字串為str,長度為n,p[i][j]表示第i到第j個字元間的最長子序列的長度(i<=j),

則:狀態初始條件:dp[i][i]=1 (i=0:n-1)

狀態轉移方程:dp[i][j]=dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1]  if(str[i]!=str[j])

dp[i][j]=dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1]+dp[i+1][j-1]+1=dp[i+1][j] + dp[i][j-1]+1  if (str[i]==str[j])

#include #include 

using

namespace

std;

int numofpalindromesubsequence(string

str)

}return dp[0][len-1];}

intmain()

return0;

}

#include #include#includeusing namespace std;

int numofpalindromesubsequence(string str)

} int result = dp[0][len - 1];

for (int i = 0; i < len; i++) delete dp[i];

delete dp;

return result;

}int main()

return 0;

}

最長回文子串 回文子串行 公共子串行

一 最長回文子串 連續 1.manacher演算法 見前面 2.動態規劃 bool p 100 100 for int i 0 i 2 reutrn s.substr start,maxlength 二 最長回文子串行 不連續 1.遞迴 2.動態規劃 3.將字串反轉,再求兩個字串的最長公共子串行lc...

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

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

最長回文子串行

一.題目描述 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 二.如下 class solution def longestpalindrome se...