647. 回文子串

给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。

回文字符串 是正着读和倒过来读一样的字符串。

子字符串 是字符串中的由连续字符组成的一个序列。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

示例 1:

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

示例 2:

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

思路:
5. 最长回文子串和这篇文章很相似。

代码:

class Solution:
    def countSubstrings(self, s: str) -> int:
        n = len(s)
        dp = [[False]*n for _ in range(n)]
        res = 0
        for j in range(n):
            for i in range(j+1):
                # 确定好边界条件
                if j - i <= 2:
                    if s[i] == s[j]:
                        dp[i][j] = True
                        res += 1
                else:
                    # 定义好状态转移方程
                    if dp[i+1][j-1] == True and s[i] == s[j]:
                        dp[i][j] = True
                        res += 1
        return res

优化:
把空间复杂度提升到O(n)

class Solution:
    def countSubstrings(self, s: str) -> int:
        n = len(s)
        dp = [False]*n
        res = 0
        for j in range(n):
            for i in range(j+1):
                # 确定好边界条件
                if s[i] == s[j] and (j - i <= 2 or dp[i+1]):
                    dp[i] = True
                    res += 1
                else:
                    # 压缩空间后一定要记得更新dp[i],因为全部是在一个列表进行,很有可能dp[i]还是以前的。
                    dp[i] = False
        return res
posted @ 2022-05-02 20:15  小Aer  阅读(2)  评论(0编辑  收藏  举报  来源