題目概述:
首先我們看見這個題的目的,是要找到乙個字串中的最長回文子字串,換句話說,正著倒著都一樣。
思路:最簡單的辦法,就是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...