給定乙個字串,你的任務是計算這個字串中有多少個回文子串。首先是暴力解法,沒想到通過了,但是用時748ms具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被計為是不同的子串。
示例 1:
輸入: 「abc」
輸出: 3
解釋: 三個回文子串: 「a」, 「b」, 「c」.
示例 2:
輸入: 「aaa」
輸出: 6
說明: 6個回文子串: 「a」, 「a」, 「a」, 「aa」, 「aa」, 「aaa」.
注意:輸入的字串長度不會超過1000。
暴力法比較簡單,相當於兩個指標指向兩個的位置
兩個位置的切片和該切片的反轉比較一下是否相等就行
貼上**
class
solution
:def
countsubstrings
(self, s:
str)
->
int:
count =
0for i in
range
(len
(s))
:for j in
range
(i,len
(s))
:if s[i:j +1]
== s[i:j +1]
[::-
1]: count +=
1return count
暴力解法簡單易懂,但是還是要看看其他大佬們怎麼做的
dpdp[i][j]定義成子串[i, j]是否是回文串。
i,j關係(s[i] == s[j])
結果舉例
i==j
dp[i][j]=true
示例 1中的a, b, c分別是回文串
i,j相鄰
dp[i][j]=true
示例 2中的aa是回文串
i,j中間只有乙個字元
dp[i][j]=true
示例 2中的aaa是回文串
i,j之間有多個字元
需要判斷dp[i+1][j-1]==true
abba
上面**是在s[i] == s[j]情況下列出,s[i] != s[j]時必然不是回文串
前三條可以合併,即 j−i≤2。因為每次如果i,j間距大於2 的時候,我們就要看dp[i+1][j-1],相當於是下一行的前乙個(也就是左下對角線的值),所以外層迴圈要從len(s)-1開始。
貼上**
class
solution
:def
countsubstrings
(self, s:
str)
->
int:
count =
0 dp =[[
false]*
len(s)
for _ in
range
(len
(s))
]for i in
range
(len
(s)-1,
-1,-
1):for j in
range
(i,len
(s))
: dp[i]
[j]=
(s[i]
== s[j]
)and
(j - i <=
2or dp[i +1]
[j -1]
)if dp[i]
[j]:
count +=
1return count
中心字元擴充套件
從每個字元開始,分別按照奇數中心和偶數中心來向左和向右拓展,直到不再是回文串為止,並且累加計數
貼上**
class
solution
:def
countsubstrings
(self, s:
str)
->
int:
count =
0for i in
range(0
,len
(s))
: odd_left = i
odd_right = i
while odd_left >=
0and odd_right <
len(s)
and s[odd_left]
== s[odd_right]
: odd_left -=
1 odd_right +=
1 count +=
1 even_left = i
even_right = i +
1while even_left >=
0and even_right <
len(s)
and s[even_left]
== s[even_right]
: even_left -=
1 even_right +=
1 count +=
1return count
最後是三種演算法的比較
leetcode hot 100 56 合併區間
給出乙個區間的集合,請合併所有重疊的區間。示例 1 輸入 intervals 1,3 2,6 8,10 15,18 輸出 1,6 8,10 15,18 解釋 區間 1,3 和 2,6 重疊,將它們合併為 1,6 示例 2 輸入 intervals 1,4 4,5 輸出 1,5 解釋 區間 1,4 和...
leetcode hot 100 55 跳躍遊戲
給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 我們可以先跳 1 步,從位置 0 到達 位置 1,然後再從位置 1 跳 3 步到達最後乙個位置。示例 2 輸入...
leetcode hot 100 56 合併區間
給出乙個區間的集合,請合併所有重疊的區間。示例 1 輸入 intervals 1,3 2,6 8,10 15,18 輸出 1,6 8,10 15,18 解釋 區間 1,3 和 2,6 重疊,將它們合併為 1,6 示例 2 輸入 intervals 1,4 4,5 輸出 1,5 解釋 區間 1,4 和...