class solution(object):
def countsubstrings(self, s):
""":type s: str
:rtype: int
"""# 遍歷s,將每個位置的字元當做回文中心擴散
n = len(s)
# 乙個字元也算是回文,所以開局count就是s中字元的數量
count = n
for i in range(n):
# 如果有兩個相同的字元,那麼將這兩個相同字元作為回文中心擴散
if i+1 < n and s[i+1] == s[i]:
count += 1
left, right = i-1, i+2
while left >= 0 and right < n and s[left] == s[right]:
count += 1
left -= 1
right += 1
# 以當前字元作為回文中心開始擴散
left, right = i-1, i+1
while left >= 0 and right < n and s[left] == s[right]:
count += 1
left -= 1
right += 1
return count
首先需要遍歷回文中心,回文中心可能是單個字元也可能是兩個字元,單個字元的回文中心有n個,兩個字元的回文中心最多有n-1個,因此最差情況需要遍歷2n-1個回文中心,即o(2n-1)=o(n)
的時間複雜度。
而每個回文中心最多可能向外擴充套件n次,因此最終的時間複雜度為o(n2)
沒有使用額外的空間
leetcode刷題 最長回文子串
看了一下題解,還有很多種方法,比如動態規劃,但是看了乙個下午也沒看太懂。所以就先把暴力破解弄懂吧。我這個菜雞,還要多多努力啊。主要問題在,不知道怎麼列舉字串的所有子串,題解中使用的是雙指標辦法,固定左指標,右指標移動得到全部的子串。最後,進行回文字串的驗證時,也是採用的雙指標方法來進行驗證。因此雙指...
leetcode刷題(43) 647 回文子串
給定乙個字串,你的任務是計算這個字串中有多少個回文子串。具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被計為是不同的子串。示例 1 輸入 abc 輸出 3 解釋 三個回文子串 a b c 示例 2 輸入 aaa 輸出 6 說明 6個回文子串 a a a aa aa aaa 注意 輸入...
leetcode刷題 125 驗證回文串
給定乙個字串,驗證它是否是回文串,只考慮字母和數字字元,可以忽略字母的大小寫。說明 本題中,我們將空字串定義為有效的回文串。示例 1 輸入 a man,a plan,a canal panama 輸出 true 示例 2 輸入 race a car 輸出 false 思路 先用replaceall ...