这道题我的思路是找到所有可能的中心位置,再从中心位置扩展,找到所有的回文子串。比如一个长度为5的串,其中心位置可能为0、1、2、3、4索引位置,那么回文子串长度就为奇数,也可能是0、1之间,1、2之间,2、3之间,3、4之间,4、5之间,那么回文子串长度就为偶数。从中心位置开始往外扩展,直到扩展到边界或者不再是回文子串。具体看注释。
class Solution:
def countSubstrings(self, s: str) -> int:
l = len(s)
if l == 0:
return 0
if l == 1:
return 1
# 先把结果加上长度为1的所有回文子串
result = l
# 长度为偶数的所有回文子串
for i in range(l-1):
left = i
right = i+1
now_result = 0
# 判断是否扩展到边界
while left >= 0 and right < l:
# 不再是回文子串
if s[left] != s[right]:
break
# 是回文子串,则加1
now_result += 1
# 从中心位置往外扩展
left -= 1
right += 1
result += now_result
# 由于长度为奇数且长度不为0的最短的回文子串长度为3,则l=2的情况特殊判断。
if l == 2:
return result
# 长度为奇数且不为1的所有回文子串
for i in range(l-2):
left = i
right = i+2
now_result = 0
while left >= 0 and right < l:
if s[left] != s[right]:
break
now_result += 1
left -= 1
right += 1
result += now_result
return result