leetcode 647 回文子串

2021-10-08 12:31:02 字數 2190 閱讀 4502

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

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

示例 1:

輸入: "abc"

輸出: 3

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

示例 2:

輸入: "aaa"

輸出: 6

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

注意:

輸入的字串長度不會超過1000。
暴力,對每個位置都檢查包含了該位置後,向後有幾個字元能組成回文串。暴力遍歷的時間複雜度是o(n

2)

o(n^2)

o(n2

),檢查回文串的時間複雜度是o(n

)o(n)

o(n)

,總共複雜度是o(n

3)

o(n^3)

o(n3)

中心擴充套件法,對每個位置中心擴充套件找回文串。回文中心的個數有o(n

)o(n)

o(n)

個,每個回文中心擴充套件的複雜度是o(n

)o(n)

o(n)

,所以總體複雜度是o(n

2)

o(n^2)

o(n2)

中心擴充套件法,首先要判斷怎麼擴充套件。

對於長度為3的字串,以abc為例:可以擴充套件的回文中心下標有:(0, 0), (0, 1), (1, 1), (1, 2), (2, 2),即共有5

對於長度為4的字串,同樣可擴充套件的回文中心下標有:(0, 0), (0, 1), (1, 1), (1, 2), (2, 2), (2, 3), (3, 3),共有7

推斷出,對於長度為n的字串,其可擴充套件的回文下標有2n - 1個,寫一下**看看回文下標和擴充套件時左右的起始下標:

回文中心下標

左起始下標

右起始下標00

0101

2113

1242

2523

633所以對於下標為i的回文中心,左起始下標是i // 2,右起始下標是i / 2向上取餘

暴力版:

class

solution

:def

countsubstrings

(self, s:

str)

->

int:

defis_palindrome

(s:str)-

>

bool

:return s == s[::

-1] cnt =

0for i in

range

(len

(s))

:for j in

range

(i,len

(s))

: cnt += is_palindrome(s[i: j +1]

)return cnt

回文中心版:

class

solution

:def

countsubstrings

(self, s:

str)

->

int:

cnt =

0for center in

range(2

*len

(s))

: left, right = center //2,

(center +1)

//2while

0<= left and right <

len(s)

and s[left]

== s[right]

: left -=

1 right +=

1 cnt +=

1return cnt

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 注意 輸入...

LeetCode 647 回文子串

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