leetcode 05 dp經典演算法題筆記

2021-09-26 19:05:28 字數 1457 閱讀 8786

題目概述:

首先我們看見這個題的目的,是要找到乙個字串中的最長回文子字串,換句話說,正著倒著都一樣。

思路:最簡單的辦法,就是n²窮舉,但是這是不行的肯定,所以我們也是採用動態規劃的思路去解決這個問題。

分為以下幾步:

<1> 排除特殊情況

傳進來的字串可能是空字串,所以我們需要將這種特殊情況排除掉

<2> 分類討論 :

(1)字串對稱方式形如「aba」

(2)字串對稱方式形如「abba」

我們要知道,這兩種情況,在我們遍歷字串的某乙個char的時候,肯定是只能發生一種情況的,要不然就是xbx這樣的,要不然就是xbbx這樣的,那麼就好辦了。

我們使用math.max(方法1,方法2),將兩種方法都考慮在內,直接返回出兩種情況的最優解。

<3> 計算最長回文串的長度

我們在遍歷的過程中,遍歷在某一位的時候,自中心向兩邊一位一位擴充套件,然後結合上面的兩種情況:

設,利用for(int i ; i < str.length();i++)遍歷這個字串

情況1

我們只需要傳入三個引數->(str,i,i)

因為,所屬情況為xbx,而b的下標就是i,左右擴充套件,但是中心的下標,就是以b為起點的,所以傳入的b的下標,也就是i。

情況2

我們只需要傳入三個引數->(str,i,i+1)

這種情況的形式為xbbx,第乙個b的下標為i,第二個b的下標也就是i+1,同樣的思路就是左右擴充套件,一位一位的對比。

兩種情況解釋完了。

<4> 計算回文字串的最左最右下標

總結一下,我們的已知條件:

回文字串的長度

遍歷的下標

總結出對應的start和end的座標計算公式

start = i - (len-1)/2

end = i + len/2

然後用substring擷取字串發出去就行了。

思路大概如此,然後貼一下我的**:

public string longestpalindrome

(string s)

int bef =

0, beh =0;

for(

int i =

0; i < s.

length()

; i++)}

return s.

substring

(bef, beh +1)

;}public

intlennum

(string s,

int l,

int r)

return r-l-1;

}

經典DP問題

動態規劃5個經典問題解析 給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子序中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大和為20。數塔問題 要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?include s...

經典DP合集

1.數字三角形 數塔問題 dp入門題 有形如下圖所示的數塔,從頂部出發,在每一結點可以選擇向左走或是向右走,一起走到底層,要求找出一條路徑,使路徑上的值最大。樣例輸入 11 8 12 7 26 6 14 15 8 12 7 13 24 11 樣例輸出 86 13 8 26 15 24 狀態轉移方程 ...

經典Dp 單調遞增最長子序列 經典dp

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 求乙個字串的最長遞增子串行的長度 如 dabdbf最長遞增子串行就是abdf,長度為4 輸入第一行乙個整數0 輸出輸出字串的最長遞增子串行的長度 樣例輸入 3 aaaababc abklmncdefg 樣例輸出 1 37 inc...