題目
給定乙個n=2000的字串,從中選乙個最長的回文子串行
顯然是dp[n][n]的演算法,注意 但對於記憶化dp的o(n^2)
你的每一次dfs(l, r): 裡面的邏輯 必須是o(1)的!!!
對於dfs(l, r):
for
(i, l, r,1)
/ 這肯定是超時的!!!而且,你考慮的 太多了...
./ dp的狀態轉移: 一般只會涉及到幾個狀態 不會太多
/ 此時,你的dp[l]
[r] 他的狀態轉移,其實只有: dp[l -1]
[r -1]
/ dp[l]
[r -
1] 和 dp[l +1]
[r]
即,問題的關鍵為: 如果此時的s[l] != s[r],他其實是可以直接轉換為另個dp裡!!
if
(s[l]
== s[r]
)return dp[l]
[r]=
max(
dfs(l, r -1)
,dfs
(l +
1, r));
/ 這個return是關鍵!!!
/ 千萬不要以為,當s[l]
!= s[r]時:
/ 你此時就必須得找出個(s[ll]
== s[rr]),不是這樣的!!
/ 找到這個(s[ll]
== s[rr]),不是非得在dp[l]
[r],可以交給子dp狀態來做!!
題目
給定n=2000的字串s,給定乙個mid
從s中,選出乙個回文子串行,且這個子串行:
必須有元素處在s[0, … , mid], 必須有元素處在s[mid+1, …, n-1]內
其實是「貪心」,即你按照「上面的模板演算法「進行即可
int
dfs(
int l,
int r,
bool f)
if(l == r)
if(l > r)
return0;
if(dp[l]
[r][f]!=-
1)return dp[l]
[r][f];if
(s[l]
== s[r]
)return dp[l]
[r][f]
=max
(dfs
(l, r -
1, f)
,dfs
(l +
1, r, f));
}
最長回文子串 最長回文子串行
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等都屬於它的字串 而字元子串行指的是字串...
最長回文子串行
一.題目描述 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 二.如下 class solution def longestpalindrome se...