回文子串(LeetCode-647)

简介: 回文子串(LeetCode-647)

回文子串(LeetCode-647)


题目

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


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


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


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


示例 1:

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


示例 2:

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


提示:


1 <= s.length <= 1000

s 由小写英文字母组成


思路

五部曲


dp[i][j] 含义


区间范围为 [ i , j ] (注意左右都是闭区间)的子串是否为回文子串,元素类型为布尔类型

递推公式


当 s [ i ] ≠ s [ j ] 时,元素值必为 f a l s e

当 s [ i ] = s [ j ] 时,分三种情况

情况一:i = j ,即二者下标相等,都指向同一个字符,肯定是回文子串

情况二:i 和 j  下标相差 1 ,例如 a a,也是回文子串

情况三:二者下标相差大于一,那必须看区间 s [ i + 1 , j − 1 ]是不是回文子串

数组初始化


初始值全为 f a l s e

遍历顺序

要注意看当前元素依靠谁的状态获取,看到前文情况三,就知道肯定对于 i ii 的遍历肯定要倒序。


代码展示

class Solution
{
public:
    int countSubstrings(string s)
    {
        int n = s.size();
        vector<vector<bool>> dp(n, vector<bool>(n, false));
        int result = 0;
        for (int j = 0; j < n; j++)
        {
            for (int i = j; i >= 0; i--)
            {
                if (s[i] == s[j])
                {
                    if (j - i <= 1)
                    {
                        dp[i][j] = true;
                        result++;
                    }
                    else
                    {
                        if (dp[i + 1][j - 1])
                        {
                            dp[i][j] = true;
                            result++;
                        }
                    }
                }
            }
        }
        return result;
    }
};
目录
相关文章
|
2月前
Leetcode第五题(最长回文子串)
这篇文章介绍了解决LeetCode第五题“最长回文子串”问题的一种方法,使用了中心扩展法来寻找给定字符串中的最长回文子串。
34 0
|
7月前
|
Java
leetcode-491:递增子序列
leetcode-491:递增子序列
46 0
|
7月前
|
Python
leetcode-14:最长公共前缀
leetcode-14:最长公共前缀
44 0
|
4月前
|
算法
LeetCode第5题最长回文子串
该文章介绍了 LeetCode 第 5 题最长回文子串的解法,通过分析回文子串的特点,使用动态规划的思想,用二维数组记录字符串是否为回文串,从后往前遍历找子串,减少重复判断,最终找到最长回文子串,并总结了解题时通过举例推导找规律的思路。
LeetCode第5题最长回文子串
|
7月前
leetcode-5:最长回文子串
leetcode-5:最长回文子串
48 0
|
7月前
|
存储 算法 Go
LeetCode第五题: 最长回文子串
给定一个字符串 `s`​,找到 `s`​ 中最长的回文子串。你可以假设 `s`​ 的最大长度为 1000。
LeetCode第五题: 最长回文子串
|
7月前
leetcode-647:回文子串
leetcode-647:回文子串
35 0
|
7月前
|
算法
力扣5、 最长回文子串
力扣5、 最长回文子串
|
算法
LeetCode5-最长回文子串
LeetCode5-最长回文子串