LeeCode:回文子串个数(动态规划)

news2024/10/5 19:12:23

文章目录

    • 一、题目
    • 二、算法思路
    • 三、代码实现
    • 四、复杂度分析

一、题目

给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。

在这里插入图片描述
https://leetcode.cn/problems/palindromic-substrings/description/

二、算法思路

本题和 最长回文子串(动态规划)类似,使用动态规划方法解决。

1、定义状态 d p [ i ] [ j ] dp[i][j] dp[i][j] 表示区间 [ i , j ] [i,j] [i,j] 是否为回文子串,如果是, d p [ i ] [ j ] = t r u e dp[i][j]=true dp[i][j]=true,否则为 f a l s e false false
2、初始化状态:单个字符是回文子串, d p [ i ] [ i ] = t r u e dp[i][i]=true dp[i][i]=true
3、状态转移:枚举区间长度,从小到大计算 d p [ i ] [ j ] dp[i][j] dp[i][j] 的值,具体的转移方程为:

dp[i][j] = true,                            i == j
           s[i] == s[j],                    j = i + 1
           s[i] == s[j] && dp[i+1][j-1],    j > i + 1

回文子串的长度可以是 1 或 2,因此先将所有长度为 1 或 2 的子串作为回文子串进行初始化。

然后,从长度为 3 开始枚举所有可能的回文子串,通过状态转移方程dp[i][j] = (s.charAt(i) == s.charAt(j) && dp[i+1][j-1]) 计算出 dp[i][j] 的值。

最后统计回文子串的个数。

三、代码实现

class Solution {
    public int countSubstrings(String s) {
        int n = s.length();
        int ans = 0;
        boolean[][] dp = new boolean[n][n];
    
        // 枚举回文子串的长度,从 1 到 n
        for (int len = 1; len <= n; len++) {
            // 枚举回文子串的起始位置 i,结束位置 j
            for (int i = 0; i < n; i++) {
                int j = i + len - 1;    //回文子串右边界位置
                if (j >= n) {   //右边界位置超过字符串长度跳出循环
                    break;
                }
                if (len == 1) {
                    dp[i][j] = true;
                } else if (len == 2) {
                    dp[i][j] = (s.charAt(i) == s.charAt(j));
                } else {
                    dp[i][j] = (s.charAt(i) == s.charAt(j) && dp[i+1][j-1]);
                }
                if (dp[i][j]) { //统计回文子串个数
                    ans++;
                }
            }
        }
        return ans;
    }
}

四、复杂度分析

  • 时间复杂度为 O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( n 2 ) O(n^2) O(n2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二值图像骨架线提取

二值图像骨架线提取HilditchThin算法Rosenfeld算法OpenCV_Contrib中的算法示例其他细化算法查表法HilditchThin的另一种算法参考二值图像骨架线提取算法&#xff1a;HilditchThin算法、Rosenfeld算法、OpenCV_Contrib中的算法 HilditchThin算法 1、使用的8邻域标记为&#xff…

Java+ElasticSearch+Pytorch实现以图搜图

以图搜图&#xff0c;涉及两大功能&#xff1a;1、提取图像特征向量。2、相似向量检索。第一个功能我通过编写pytorch模型并在java端借助djl调用实现&#xff0c;第二个功能通过elasticsearch7.6.2的dense_vector、cosineSimilarity实现。一、准备模型创建demo.py&#xff0c;输…

cuda2D FDTD——share

https://www.coder.work/article/30133 shared memory只能在block内共享&#xff0c;之间无法互相通信 对于2D TM波动方程计算&#xff0c;我们可以使用以下策略来处理共享内存的边界&#xff1a; 将全局内存中的数据复制到共享内存中时&#xff0c;除了将每个线程需要的数据…

Python爬虫实践:优志愿 院校列表

https://www.youzy.cn/tzy/search/colleges/collegeList获取目标网址等信息打开开发人员工具&#xff08;F12&#xff09;&#xff0c;拿到调用接口的地址&#xff0c;以及接口请求参数等信息&#xff0c;如下curl https://uwf7de983aad7a717eb.youzy.cn/youzy.dms.basiclib.ap…

假如你知道这样的MySQL性能优化

1. 为查询缓存优化你的查询 大多数的 MySQL 服务器都开启了查询缓存。这是提高性最有效的方法之 一&#xff0c;而且这是被 MySQL 的数据库引擎处理的。当有很多相同的查询被执行了多次的时候&#xff0c;这些查询结果会被放到一个缓存中&#xff0c;这样&#xff0c;后续的相同…

Kogito -- 入门详解

Kogito -- 入门详解1. Introduction1.1 Version1.2 Introduction2.Environment Install2.1 JDK Install2.2 Maven Install&#xff08;3.8.6&#xff09;2.3 Idea2.4 VSCode3. Run Code3.1 Dependency3.2 Run3.3 Swagger4.Awakening4.1 Big Data -- Postgres5.Awakening5.1 Big…

如何做一个高级的文本编辑器 textarea,拥有快捷键操作

如何做一个高级的文本编辑器 textarea&#xff0c;拥有快捷键操作 最近想做一个高级点的 textarea &#xff0c;支持 JetBrains 系列软件的快捷键&#xff0c;比如&#xff1a; CTRL D 复制当前行。Tab 在前面插入 4 个空格。Shift Tab 删除行前的空格&#xff0c;多于4个&a…

google独立站和与企业官网的区别是什么?

google独立站和与企业官网的区别是什么&#xff1f; 答案是&#xff1a;独立站通过谷歌SEO优化可以更好的获取自然排名的流量。 随着互联网的不断发展&#xff0c;企业越来越重视自身网站的建设和优化&#xff0c;而在企业网站建设中&#xff0c;很多人会犯一个常见的错误&am…

模块、包和异常

目录1.模块import 导入from...import 导入2. 模块的搜索顺序3. __name__属性的使用4. 包包的使用步骤5. 发布模块6. 安装模块7. 卸载模块8. pip 安装第三方模块9. 异常处理异常捕获异常的传递抛出 raise 异常1.模块 模块是 Python 程序架构的一个核心概念 每一个以扩展名 py …

LPDDR4x 的 学习总结(4) - SDRAM chip的组织结构

上节总结cell的结构和基本操作 本节基于cell组合起来的DRAM组织结构 DDR Device 的组织结构 Cells 以特定的方式组成 Column/Row/Bank/Chip/Rank/DIMM/Channel等多层级组织结构如下图&#xff1a; 图1 - DRAM的组织结构 图2 - DRAM容量的组织结构图 Channel: 同1个DDR控制器 …

GIT基础常用命令-1 GIT基础篇

git基础常用命令-1 GIT基础篇1.git简介及配置1.1 git简介1.2 git配置config1.2.1 查看配置git config1.2.2 配置设置1.2.3 获取帮助git help2 GIT基础常用命令2.1 获取镜像仓库2.1.1 git init2.1.2 git clone2.2 本地仓库常用命令2.2.1 git status2.2.2 git add2.2.3 git diff2…

seata1.5.2使用从零快速上手(提供代码与安装包)

1.软件准备&#xff1a; 1.1 seata1.5.2 官网下载&#xff1a;地址:http://seata.io/zh-cn/ server源码:https://github.com/seata/seata 百度云下载&#xff08;建议&#xff09;: 百度下载 链接&#xff1a;https://pan.baidu.com/s/1eilbSI0YdmupHYI7FroTsw 提取码&…

【编程基础之Python】10、Python中的运算符

【编程基础之Python】10、Python中的运算符Python中的运算符算术运算符赋值运算符比较运算符逻辑运算符位运算符成员运算符身份运算符运算符优先级运算符总结Python中的运算符 Python是一门非常流行的编程语言&#xff0c;它支持各种运算符来执行各种操作。这篇文章将详细介绍…

构造有向无环图(拓扑排序)

蓝桥杯集训每日一题 acwing3696 给定一个由 n 个点和 m 条边构成的图。 不保证给定的图是连通的。 图中的一部分边的方向已经确定&#xff0c;你不能改变它们的方向。 剩下的边还未确定方向&#xff0c;你需要为每一条还未确定方向的边指定方向。 你需要保证在确定所有边的…

独家揭秘:站外引流的十大技巧!

在今天的互联网时代&#xff0c;如何有效地引流已成为网站运营者面临的一个重要问题。 站外引流是指通过在其他网站或平台上建立链接或发布内容&#xff0c;将流量引导到自己的网站&#xff0c;提高自己网站的访问量。 本文将为大家揭秘站外引流的十大技巧&#xff0c;帮助大…

python项目搭建(上)

提示&#xff1a;惊觉相思不露&#xff0c;原来只因已入骨 文章目录前言软件的安装HTTP协议1.安装Django启动Django路由子表定义数据库创建数据库表过滤条件生成HTML前言 这里是用python搭建的一个**销售管理系统&#xff0c;用于记录个人遇到的一些错误 提示&#xff1a;以下…

软测入门(七)python操作数据文件(Json、yaml、csv、excel、xml)

python操作文件 txt文件 read() : 读取所有readline() : 读取一行readlines() : 读取所有&#xff0c;且以行为单位&#xff0c;放入list列表中 file open(r"F:\abc.txt", "r", encoding"utf-8") # 以utf-8格式读取文件 # 读取所有 # print…

IM即时通讯开发之常用加解密算法与通讯安全讲解

平时开发工作中&#xff0c;我们会经常接触加密、解密的技术。尤其在今天移动互联网时代&#xff0c;越来越多的用户会将数据存储在云端&#xff0c;或使用在线的服务处理信息。这些数据有些涉及用户的隐私&#xff0c;有些涉及用户的财产&#xff0c;要是没有一套的方案来解决…

儿童写作业的台灯怎么选择?2023给孩子买台灯最新推荐一下

儿童年龄比较小&#xff0c;所以眼睛也比较脆弱&#xff0c;然而现在的社会普遍节奏较快&#xff0c;无论是上班族&#xff0c;还是大中小学生&#xff0c;压力都比较大&#xff0c;儿童经常晚上看书、写字学习&#xff0c;眼睛难免劳累&#xff0c;所以儿童台灯最重要的就是柔…

CDGA|给金融科技数据治理的四大建议,从根基上解决问题

随着我国金融科技行业的发展&#xff0c;当前的数据治理水平已无法满足金融反哺实体经济发展的效率需要。 目前主要存在数据基础设施不完善导致的治理根基薄弱核心问题&#xff0c;建议从以下四个方面进行完善数据基础设施&#xff0c;构筑金融科技数据治理体系。 加强顶层设计…