題目:
給定乙個字串 s ,找到其中最長的回文子串行,並返回該序列的長度。可以假設 s 的最大長度為 1000 。
示例 1:
輸入:"bbbab"
輸出:4
乙個可能的最長回文子串行為 "bbbb"。
示例 2:
輸入:"cbbd"
輸出:2
乙個可能的最長回文子串行為 "bb"。
1 <= s.length <= 1000
s 只包含小寫英文本母
題意解釋最長子序列區別於最長回文子串,子串必須是連續的,而子串行則可以跳躍,
例如:aabcaa的最長回文子串為aa,但是它的最長回文子串行為aabaa或aacaa.
一般思路
例如:a 則最長回文子串行為 a
bab 則最長回文子串行為 bab
bacb 則最長回文子串行為 bab 或 bcb
不難發現規律:
從第乙個和最後乙個開始比較。如果最後乙個和第乙個相等。
則result等於以第二個到倒數第二個為新的字串求最長回文子串行加二。
f(「bacb」) = f(「ac」) + 2
如果不相等則有:
f(「bacbe」) = max(f(「bacb」),f(「acbe」)
依次內推。。。。。。
自己踩過的坑(根據上面的推導):
public
static
intlongestpalindromesubseq
(string s)
public
intlongestpalindromesubseq
(char
array,
int start,
int end)
else
}
執行結果超出時間限制
分析原因
例如:在計算f(「bacbe」) = max(f(「bacb」),f(「acbe」)時。當我們計算f(「bacb」)
和f(「acbe」)我們會重複計算f(「ac」) 當字串越長我們重複計算的次數越多,
這就是我們超時的原因。
優化
如果我們能將我們已經結算過的值保持起來,當再次使用時直接取值即可。
優化後
public
static
intlongestpalindromesubseq1
(string s)
private
static
intlongestpalindromesubseq
(string s,
int start,
int end,
int[
] array)
else
return array[start]
[end]
;}
改進(運用動態規劃)動態規劃演算法是通過拆分問題,定義問題狀態和狀態之間的關係,使得問題能夠以遞
推(或者說分治)的方式去解決。動態規劃演算法的基本思想與分治法類似,也是將待
求解的問題分解為若干個子問題(階段),按順序求解子階段,前一子問題的解,為
後一子問題的求解提供了有用的資訊。在求解任一子問題時,列出各種可能的區域性解
,通過決策保留那些有可能達到最優的區域性解,丟棄其他區域性解。依次解決各子問題
,最後乙個子問題就是初始問題的解。
基本思想:
由於動態規劃解決的問題多數有重疊子問題這個特點,為減少重複計算,對每乙個子
問題只解一次,將其不同階段的不同狀態儲存在乙個二維陣列中。
定義dp陣列:dp[i][j]表示區間[i,j]對應子串的最長回文子串行的長度。
根據遞迴式,我們很容易得到狀態轉移方程:
由於計算dp[i][j]可能需要借助dp[i][j-1]和dp[i+1][j],即前一列和下一行的結果,所以填表的方向是從下往上,從左往右,如圖箭頭所示。
最長回文子串 最長回文子串行
1.最長回文子串行 可以不連續 include include include include using namespace std 遞迴方法,求解最長回文子串行 intlps char str,int i,int j intmain include include include using n...
最長回文子串行 回文子串行個數
主要內容 1 什麼是回文?2 字元子串和字元子串行的區別 3 最長回文子串行的思路和 4 回文子串行個數的思路和 回文指的是正讀和反讀都一樣的字串,如aba,abba等 字元字串指的是字串中連續的n個字元 如palindrome中,pa,alind,drome等都屬於它的字串 而字元子串行指的是字串...
LeetCode 516 最長回文子串行
這題看了好久 本來以為和最長字串差不多用動態規劃設兩個列表來算但是沒什麼頭緒 後來去看了別人的解法 看了十幾分鐘才看懂 下面這種解法 1單位要單獨拿出來算 從2開始因為互文的子串行兩頭肯定是一樣的 如 aba acbca 假如能使 martix i j 等於從 s i 到 s j 所包含的最大子串行...