每日一练:回文子串

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表,dpij保存以sj为开头、si为结尾的子串是否为回文,状态转移方程如下:

如果sj != si,则必不会是回文,dpij = false;

如果sj == si

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

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

(3)并且j < i-1 && dpi-1j+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;
    }
};
相关推荐
sali-tec1 小时前
C# 基于OpenCv的视觉工作流-章108-区域筛选
图像处理·人工智能·opencv·算法·计算机视觉
Gigavision6 小时前
基于BUAA-MIHR数据集的噪声解耦对比学习算法
人工智能·python·深度学习·算法
鹿角片ljp7 小时前
LeetCode 64:最小路径和复盘|二维 DP 与 ACM 模式完整写法
java·数据结构·算法
彧azz8 小时前
算法设计与分析:贪心与动态规划
数据结构·学习·算法·贪心算法·动态规划
Beyond_System|系统之外9 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
汉克老师10 小时前
GESP2026年9月认证C++六级( 第三部分编程题(1、数组划分))精讲
c++·gesp·小学生·学c++编程
千里码aicood10 小时前
基于PLC与机器视觉的智能分拣控制系统设计
c++·自动化·plc
漂流瓶jz10 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
圣保罗的大教堂10 小时前
leetcode 835. 图像重叠 中等
leetcode
朽棘不雕11 小时前
进一步了解模板
c++