LeetCode動態規劃之最長回文子串

2021-10-02 21:08:50 字數 1338 閱讀 7194

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

輸入: "babad"

輸出: "bab"

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

輸入: "cbbd"

輸出: "bb"

首先,必須要明確最長回文子串的含義,簡單來說就是 從前往後讀和從後往前讀 是一樣的,按照我們動態規劃解題3步驟:定義陣列元素含義,找出陣列元素間的含義和找出陣列的初始值。我們既然要找到最長的回文子串,那麼也就必須遍歷字串s中的所有子串,乙個方式就是用二維陣列dp[i][j]來表示字串s中第i到第j個字元的子串(j>=i,i取值為0至n-1),其取值為bool值,true代表著是回文子串,false代表著不是回文子串。

根據回文子串的含義,如果dp[i][j]是回文子串的話,那麼在這個回文子串的前後加上相同的字元,那麼就構建了乙個新的回文子串dp[i-1][j-1],示意圖如下:

公式如下:

一般來說,我們的初始值需要根據陣列間元素公式和下標的取值來決定,因為 j>=i ,所以根據變換公式 j-1>=i+1, 所以 j>=i+2 ,我們需要知道的初始值是 j=i 和 j=i+1,其求值公式為:

這次的初始值選取和之前的題不太一樣,每乙個點的值由其左下角的值和相應位置的字元決定,在**上表示為

class solution {

public:

string longestpalindrome(string s) {

int n = s.length();

int a = 0,b = 1;

/*bool** dp = new bool*[n];

for(int i = 0; i> dp(n,vector(n,false));

for(int i = 0;i程式需要注意一些細節問題:

程式中的j並不是表示的第j個元素,而是表示的是從第i個元素開始往後數j個字元

s.substr(int a, int b)的引數表示的是擷取 s的從第a個字元開始往後數b個字元

程式中申請陣列空間的方式有2種:用new;用vector容器;(程式如上)

動態規劃之最長回文串

dp i j 表示 以s i 開始s j 結尾的回文串的長度。如果這個字串不是回文串,讓dp i j 0 顯然,j i,只需往dp填j i的部分即可。dp i j 的遞推公式可以這麼表述 1 首先對dp的對角線元素初始化為1,也就是當i j時,dp i j 1。這很顯然,每個單獨的字元其實就是個長度...

動態規劃之最長回文子串行

15 2 最長回文子串行 回文 palindrome 是正序與逆序相同的非空字串。例如,所有長度為1的字串,civic,racecar,aibohphobia都是回文。設計高效演算法,求給定輸入字串的最長回文子串行。例如,給定輸入character,演算法應該返回carac.演算法的執行時間是怎麼樣...

動態規劃之最長遞增子串行

基本歸納法 對於ai 1,只要考察其前乙個狀態ai即可完成整個推理過程,它的特點是只要ai確定,則計算ai 1便不需要考察前序狀態a0.ai 1,我們將這一模型稱之為馬爾科夫模型 高階歸納法 相應的,對於ai 1,考察前i個狀態集才可完成整個推理過程,往往稱之為高階馬爾科夫模型 在計算機演算法中,高...