最長回文子串行

2021-10-20 08:53:48 字數 1329 閱讀 5190

題目

給定乙個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...