清單
● 647. 回文字串
● 516. 最長回文子序列
LeetCode #647 回文字串
1. 題目
給你一個字符串 s ,請你統(tǒng)計并返回這個字符串中回文子串的數(shù)目。
回文字符串是正著讀和倒過來讀一樣的字符串。
子字符串是字符串中的由連續(xù)字符組成的一個序列。
具有不同開始位置或結(jié)束位置的子串,即使是由相同的字符組成,也會被視作不同的子串
2. 思路
需要判斷回文字符串(正著讀和倒過來讀)采用二維數(shù)組
增加一個result 參數(shù)用于記錄True個數(shù) 最后return result 即為答案
- dp含義: s[i] (正著讀) 和 s[j] (倒著讀) 能否形成回文字符串
- 遞推公式 :
- s[i] != s[j] —> dp[i][j] = False
- s[i] == s[j]:
-
- j - i <=1 ----> dp[i][j] = True
-
- j - i > 1 -----> dp[i][j] = dp[ i+1 ][ j-1 ]
- 初始化: dp[0][0] = False
- 遍歷順序: 因為j為倒著讀 因此遍歷順序為從下至上 從左往右(類比雙指針)
3. 代碼實現(xiàn)
class Solution:
def countSubstrings(self, s: str) -> int:
#Initial dp
dp = [[False] * len(s) for _ in range(len(s))]
result = 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:
dp[i][j] = True
result += 1
elif dp[i+1][j-1]:
dp[i][j] = True
result += 1
return result
LeetCode #516 最長回文子序列
1. 題目
給你一個字符串 s,找出其中最長的回文子序列,并返回該序列的長度。
子序列定義為:不改變剩余字符順序的情況下,刪除某些字符或者不刪除任何字符形成的一個序列。文章來源:http://www.zghlxwxcb.cn/news/detail-728541.html
2. 思路
需要統(tǒng)計回文字符串長度(正著讀和倒過來讀)采用二維數(shù)組文章來源地址http://www.zghlxwxcb.cn/news/detail-728541.html
- dp含義: s[i] (正著讀) 和 s[j] (倒著讀) 形成的回文字符串長度為dp[i][j]
- 遞推公式 :
- s[i] != s[j] —> dp[i][j] = max(dp[i+1][j], dp[i][j-1])
- s[i] == s[j]: dp[i][j] = dp[i+1][j-1] + 2
- 初始化: dp[0][0] = 0, dp[i][i] = 1
- 遍歷順序: 因為j為倒著讀 因此遍歷順序為從下至上 從左往右(類比雙指針)
3. 代碼實現(xiàn)
class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
#Initial dp
dp = [[0] * len(s) for _ in range(len(s))]
for i in range(len(s)):
dp[i][i] = 1
for 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] + 2
else:
dp[i][j] = max(dp[i+1][j], dp[i][j-1])
return dp[0][-1]
到了這里,關(guān)于代碼隨想錄 Day - 59|#647 回文字串|#516 最長回文子序列的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!