647. 回文子串
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
暴力解法是O(n的三次方),即使用n²复杂度来枚举所有可能的回文子串情况,再用n的复杂度来判断其是否为回文数
优化解法:dp[x][y]表示初始位置x(范围是1~n),长度为y的子串是否是回文串,倒三角判断。
class Solution:
def countSubstrings(self, s: str) -> int:
n = len(s)
if (n<2):
return n
dp = [[True] * (n+1) for i in range(n+1)]
ans = 0
for j in range(2,n+1):
for i in range(1,n+1):
if(j<n+2-i):
dp[i][j] = dp[i+1][j-2] and s[i-1] == s[i+j-2]
if dp[i][j]:
ans +=1
return ans+n
时间复杂度O(n²)
空间复习度O(n²)
还可以使用回文中心法,即以一个字符/两个字符为中心向两边扩展,如果扩展的两个字符相同,则回文数记数+1,之所以分一个字符和两个字符,是因为奇数个字符的回文串,有一个中心,而偶数个字符的回文串,有两个中心,时间复杂度是O(n²),空间复杂度是O(1)