LeetCode Hot 100 647回文子串

2021-09-29 23:25:08 字數 2892 閱讀 3040

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

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

示例 1:

輸入: 「abc」

輸出: 3

解釋: 三個回文子串: 「a」, 「b」, 「c」.

示例 2:

輸入: 「aaa」

輸出: 6

說明: 6個回文子串: 「a」, 「a」, 「a」, 「aa」, 「aa」, 「aaa」.

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

首先是暴力解法,沒想到通過了,但是用時748ms

暴力法比較簡單,相當於兩個指標指向兩個的位置

兩個位置的切片和該切片的反轉比較一下是否相等就行

貼上**

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 和...