力扣 LCR 020 回文子串 -Python

题目链接: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值