這是基于代碼隨想錄的每日打卡
647. 回文子串
給你一個字符串 s
,請你統計并返回這個字符串中 回文子串 的數目。
回文字符串 是正著讀和倒過來讀一樣的字符串。
子字符串 是字符串中的由連續字符組成的一個序列。
示例 1:
輸入:s = "abc"
輸出:3
解釋:三個回文子串: "a", "b", "c"
示例 2:
輸入:s = "aaa"
輸出:6
解釋:6個回文子串: "a", "a", "a", "aa", "aa", "aaa"
動態規劃
class Solution:def countSubstrings(self, s: str) -> int:# dp[i][j]含義:區間[i,j]的字符串是否是回文子串dp=[[False for j in range(len(s))] for i in range(len(s))]res=0 # 記錄回文子串個數for i in range(len(s)-1,-1,-1):for j in range(i,len(s)):if s[i]==s[j]:if j-i<=1:res+=1dp[i][j]=Trueelse:if dp[i+1][j-1]==True:dp[i][j]=Trueres+=1return res
運行結果
516. 最長回文子序列
給你一個字符串 s
,找出其中最長的回文子序列,并返回該序列的長度。
子序列定義為:不改變剩余字符順序的情況下,刪除某些字符或者不刪除任何字符形成的一個序列。
示例 1:
輸入:s = "bbbab"
輸出:4
解釋:一個可能的最長回文子序列為 "bbbb" 。
示例 2:
輸入:s = "cbbd"
輸出:2
解釋:一個可能的最長回文子序列為 "bb" 。
動態規劃
class Solution:def longestPalindromeSubseq(self, s: str) -> int:# dp[i][j]含義:s[i,j]的最長回文子串長度dp=[[0 for j in range(len(s))] for i in range(len(s))]# 初始化只有一個字符的時候為回文子串for i in range(len(s)):dp[i][i]=1for i in range(len(s)-1,-1,-1):for j in range(i+1,len(s)):if s[i]==s[j]:dp[i][j]=dp[i+1][j-1]+2else:dp[i][j]=max(dp[i+1][j],dp[i][j-1])return dp[0][-1]
運行結果