代碼隨想錄算法訓(xùn)練營第五十九天|647. 回文子串、516.最長回文子序列

647.?回文子串

動(dòng)規(guī)五部曲

確定dp數(shù)組(dp table)以及下標(biāo)的含義

dp[i][j]:表示區(qū)間范圍[i,j] (注意是左閉右閉)的子串是否是回文子串,如果是dp[i][j]為true,否則為false

確定遞推公式

s[i]!=s[j]?dp[i][j]=false

s[i]==s[j]

if(s[i]==s[j]){if(j-i<=1){// 情況一 和 情況二result++;dp[i][j]=true;}elseif(dp[i+1][j-1]){// 情況三result++;dp[i][j]=true;}}

dp數(shù)組初始化

dp[i][j]初始化為false

確定遍歷順序

從下到上,從左到右遍歷,保證dp[i + 1][j - 1]是經(jīng)過計(jì)算的

for(inti=s.size()-1;i>=0;i--){// 注意遍歷順序for(intj=i;j<s.size();j++){if(s[i]==s[j]){if(j-i<=1){// 情況一 和 情況二result++;dp[i][j]=true;}elseif(dp[i+1][j-1]){// 情況三result++;dp[i][j]=true;}}}}

舉例推導(dǎo)dp數(shù)組


516.最長回文子序列

動(dòng)規(guī)五部曲

確定dp數(shù)組(dp table)以及下標(biāo)的含義

dp[i][j]:字符串s在[i, j]范圍內(nèi)最長的回文子序列的長度為dp[i][j]

確定遞推公式

s[i]==s[j]??dp[i][j] = dp[i + 1][j - 1] + 2;

s[i]!=s[j]?dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);

if(s[i]==s[j]){dp[i][j]=dp[i+1][j-1]+2;}else{dp[i][j]=max(dp[i+1][j],dp[i][j-1]);}

dp數(shù)組初始化

當(dāng)i與j相同,那么dp[i][j]等于1,其余情況初始化0

確定遍歷順序

dp[i][j] 依賴于 dp[i + 1][j - 1] ,dp[i + 1][j] 和 dp[i][j - 1]

從下到上。從左往右遍歷

for(inti=s.size()-1;i>=0;i--){for(intj=i+1;j<s.size();j++){if(s[i]==s[j]){dp[i][j]=dp[i+1][j-1]+2;}else{dp[i][j]=max(dp[i+1][j],dp[i][j-1]);}}}

舉例推導(dǎo)dp數(shù)組

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容