每日一练:回文子串

LCR 020. 回文子串 - 力扣(LeetCode)

题目要求:

给定一个字符串 s ,请计算这个字符串中有多少个回文子字符串。

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= s.length <= 1000
  • s 由小写英文字母组成

解法-1 动态规划 O(N^2):

这道题可以使用dp表保存所有子串状态:

创建一个二维dp表,dp[i][j]保存以s[j]为开头、s[i]为结尾的子串是否为回文,状态转移方程如下:

如果s[j] != s[i],则必不会是回文,dp[i][j] = false;

如果s[j] == s[i]:

(1)并且i==j,只有一个字母一定是回文;

(2)并且j == i-1,两个相同字母也一定是回文;

(3)并且j < i-1 && dp[i-1][j+1],它们中间有字符,且中间的子串也是回文,则一定是回文。

cpp 复制代码
class Solution {
public:
    int countSubstrings(string s) {
        int n = s.size();

        vector<vector<bool>> dp(n);
        for (int i = 0; i < n; i++)
            dp[i].resize(i + 1, true);

        int ret = 1;
        for (int i = 1; i < n; i++) {
            for (int j = 0; j <= i; j++) {
                if (s[i] != s[j])
                    dp[i][j] = false;
                else if (j < i - 1) // i、j中间有其他字符
                    dp[i][j] = dp[i - 1][j + 1];

                ret += dp[i][j] ? 1 : 0;
            }
        }

        return ret;
    }
};
相关推荐
小苏兮1 分钟前
【C++】priority_queue和deque的使用与实现
开发语言·c++·学习
Mr_WangAndy8 分钟前
C++设计模式_行为型模式_迭代器模式Iterator
c++·设计模式·迭代器模式
FL162386312923 分钟前
C++基于opencv实现的暗通道的先验图像去雾
c++·opencv·计算机视觉
仰泳的熊猫1 小时前
LeetCode:538. 把二叉搜索树转换为累加树/1038. 从二叉搜索树到更大和树
数据结构·c++·算法·leetcode
kyle~1 小时前
C++---向上取整
开发语言·c++
weixin_307779131 小时前
Clickhouse导出库的表、视图、用户和角色定义的SQL语句
开发语言·数据库·算法·clickhouse·自动化
piggy侠1 小时前
【GitHub每日速递 251016】23k star,Daytona:90ms内极速运行AI代码,安全弹性基础设施来袭!
算法·github
小龙报1 小时前
《算法通关指南---C++编程篇(1)》
开发语言·c++·程序人生·算法·学习方法·visual studio
Cx330❀2 小时前
《C++ 手搓list容器底层》:从结构原理深度解析到功能实现(附源码版)
开发语言·数据结构·c++·经验分享·算法·list
Swift社区2 小时前
LeetCode 399 除法求值
算法·leetcode·职场和发展