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