給定乙個字串首先,必須要明確最長回文子串的含義,簡單來說就是 從前往後讀和從後往前讀 是一樣的,按照我們動態規劃解題3步驟:定義陣列元素含義,找出陣列元素間的含義和找出陣列的初始值。我們既然要找到最長的回文子串,那麼也就必須遍歷字串s中的所有子串,乙個方式就是用二維陣列dp[i][j]來表示字串s中第i到第j個字元的子串(j>=i,i取值為0至n-1),其取值為bool值,true代表著是回文子串,false代表著不是回文子串。s
,找到s
中最長的回文子串。你可以假設s
的最大長度為 1000。輸入: "babad"
輸出: "bab"
注意: "aba" 也是乙個有效答案。
輸入: "cbbd"
輸出: "bb"
根據回文子串的含義,如果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個狀態集才可完成整個推理過程,往往稱之為高階馬爾科夫模型 在計算機演算法中,高...