Leetcode 中等 647 回文子串

2021-10-14 04:10:12 字數 1388 閱讀 1323

給定乙個字串,你的任務是計算這個字串中有多少個回文子串。

具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被視作不同的子串。

示例 1:

輸入:"abc"

輸出:3

解釋:三個回文子串: "a", "b", "c"

示例 2:

輸入:"aaa"

輸出:6

解釋:6個回文子串: "a", "a", "a", "aa", "aa", "aaa"

輸入的字串長度不會超過 1000 。

假設,s[i...j](i...j 表示這個區間內的字元包含 i、j)是回文串。那麼 s[i-1...j+1] 只有在 s[i-1] == s[j+1] 的情況下,才是回文串。

狀態定義

現在設 dp[i][j] 表示 s[i...j] 是否是回文串。

狀態轉移方程

接下來,我們分析一下,子串是回文串成立的情況:

我們可以看到,第

二、三種情況是可以合併在一起的。

當 s[i]==s[j],只要 i==j-1 或者 dp[i+1][j-1]==true 其中乙個成立,dp[i][j] 都為 true,s[i...j] 是回文串。公式如下:

$dp[i][j] = true, \qquad if , (s[i] == s[j]) , and , (i==j-1 , or , dp[i+1][j-1])$

再看第一種情況,我們發現,其實 i==j 時,s[i] == s[j] 也是成立的,只是此時 i=j-0,。

那麼這裡再將第一種情況跟上面合併,也就是 i >= j - 1 或者 i - j >= -1 時,公式如下:

$dp[i][j] = true, \qquad if , (s[i] == s[j]) , and , (i-j>=-1 , or , dp[i+1][j-1])$

複雜度分析:

python**如下:

class solution:

def countsubstrings(self, s: str) -> int:

# 計數

count = 0

n = len(s)

# 定義 dp 陣列,初始化為 false

dp = [[false] * n for _ in range(n)]

# 我們從右往左遍歷,填充 dp 陣列

for i in range(n-1, -1, -1):

for j in range(i, n):

# 根據文章得出的狀態轉移方程

if s[i]==s[j] and (i-j>=-1 or dp[i+1][j-1]):

dp[i][j] = true

count += 1

return count

leetcode題 647 回文子串(中等)

一 題目描述 647.回文子串 中等 給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被計為是不同的子串。示例 1 輸入 abc 輸出 3 解釋 三個回文子串 a b c 示例 2 輸入 aaa 輸出 6 說明 6個回文子串 a ...

leetcode647 回文子串

給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被計為是不同的子串。示例 輸入 aaaba 輸出 9 解釋 a aa a aa aaa a b aba a 奇回文 如 aba 和偶回文 如abba 歸一化處理 i 0123 47s...

leetcode 647 回文子串

給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被計為是不同的子串。示例 1 輸入 abc 輸出 3 解釋 三個回文子串 a b c 示例 2 輸入 aaa 輸出 6 說明 6個回文子串 a a a aa aa aaa 注意 輸入...