給定乙個字串,你的任務是計算這個字串中有多少個回文子串。
具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被視作不同的子串。
示例 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 注意 輸入...