题目链接:LCR 020. 回文子串 - 力扣(LeetCode)
题目描述:
给定一个字符串 s
,请计算这个字符串中有多少个回文子字符串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:
输入:s = "abc" 输出:3 解释:三个回文子串: "a", "b", "c"
示例 2:
输入:s = "aaa" 输出:6 解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
题目思路:
回文子串是指从中间数为对称轴,左右两边数目相等且数值相同的一串数字
可以定义左右指针i和j
1.定义dp数组,dp[i][j]的含义是,从下标i到下标j的数是否是回文数
2.递推公式:当s[i]=s[j] 也就是当前左右对称指针相等时,判断内部是否为回文子串
若 dp[ i + 1 ][ j - 1 ] 为True,则内部也为回文子串,那么dp[i][j]也为True,也为回文子串
数量 result + 1
3.初始化result = 0 ,dp数组初始化都为False,所以只判断是否为回文子串改为True即可
代码实现
class Solution(object):
def countSubstrings(self, s):
"""
:type s: str
:rtype: int
"""
result = 0
dp = [[False for _ in range(len(s))] for _ in range(len(s))]
for i in range(len(s)-1,-1,-1):
for j in range(i,len(s)):
if s[i] == s[j]:
if j - i <= 1:
dp[i][j] = True
result += 1
elif dp[i+1][j-1]:
dp[i][j] = True
result += 1
return result