LeetCode 647. 回文子串|刷题打卡

156 阅读2分钟

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

题目链接:LeetCode 647. 回文子串 难度:中等

一、题目描述

给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:

输入:"abc"
输出:3
解释:三个回文子串: "a", "b", "c"

示例 2:

输入:"aaa"
输出:6
解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"

提示:输入的字符串长度不会超过 1000 。

二、思路分析

对于每一个串,先判断最左最右边是否相等,再判断剩余子串是否为回文串,就能判断出当前串是不是回文串了。
也就是说,子串对于更长的串的判断是有贡献的。可以用dp[i][j]存储i到j的子串是否为回文串,从长度为1和长度为2的子串出发,判断长度为3的串,再判断长度为4的串...一直到判断整个字符串。 这也就是所谓的动态规划(DP)了。

三、AC 代码

    def countSubstrings(self, s: str) -> int:
        n = len(s)
        dp = [[0 for _ in range(n)] for _ in range(n)]
        dp[0][0] = 1
        res = 1
        for i in range(1,n):
            dp[i][i] = 1
            res+=1
            if s[i-1] == s[i]:
                dp[i-1][i] = 1
                res+=1
        length = 3
        while length <= n:            
            for i in range(n-length+1):
                start = i
                end = start+length-1
                if s[start] == s[end] and dp[start+1][end-1] == 1:
                    dp[start][end] = 1
                    res += 1 
                    # print(start,end)
            length += 1
        return res

四、总结

遇到这类问题,思考小问题对于大问题的解决是有贡献,如果有贡献,就从小问题开始,不断解决更大的问题。

如果你觉的还不错的话,给我点个赞吧💐