每日OJ题_回文串dp①_力扣647. 回文子串

目录

力扣647. 回文子串

解析代码


力扣647. 回文子串

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 由小写英文字母组成
class Solution {
public:int countSubstrings(string s) {}
};

解析代码

        这道题虽然动态规划的解法不是最优的解法(官方题解的中心拓展解法简单且空间是O(1),两种解法的时间都是O(N^2),但此题动态规划解法空间是O(N^2)),但是可以为后面的回文串dp类型的困难题做准备,思路就是可以先预处理一下,将所有子串是否回文的信息统计在 dp 表里面,然后直接在表里面统计 true 的个数即可。

        状态表示: 为了能表示出来所有的子串,我们可以创建⼀个 n * n 的二维 dp 表,只用到上三角部分即可。 其中, dp[i][j] 表示: s 字符串区间 [i, j] 的子串,是否是回文串。

状态转移方程:对于回文串,我们一般分析一个区间两头的元素:

当 s[i] != s[j] 的时候:不可能是回文串, dp[i][j] = 0 ;

当 s[i] == s[j] 的时候:根据长度分三种情况讨论:

  • 长度为 1 ,也就是 i == j :此时一定是回文串, dp[i][j] = true ;
  • 长度为 2 ,也就是 i + 1 == j :此时也一定是回文串, dp[i][j] = true ;
  • 长度大于 2 ,此时要去看看 [i + 1, j - 1] 区间的子串是否回文: dp[i][j]= dp[i + 1][j - 1] ;

综上,状态转移方程分情况谈论即可。

分情况很细,无需初始化,填 j 用到 j - 1,所以从下往上填表,最后返回dp表中ture的个数。

class Solution {
public:int countSubstrings(string s) {int n = s.size(), ret = 0;vector<vector<bool>> dp(n, vector<bool>(n, false));// dp[i][j] 表示: s 字符串区间 [i, j] 的子串,是否是回文串for(int i = n - 1; i >= 0; --i){for(int j = i; j < n; ++j){if(s[i] == s[j])// if(i == j || i + 1 == j)dp[i][j] = i + 1 >= j ? true : dp[i + 1][j - 1] ;if(dp[i][j])++ret;}}return ret;}
};

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

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

相关文章

Python实现逻辑回归(Logistic Regression)

Python实现逻辑回归(Logistic Regression) 1. 背景介绍 逻辑回归是一种广泛应用于分类问题的统计方法&#xff0c;特别是在二分类问题中。它是一种线性回归的扩展&#xff0c;用于预测目标变量的概率。逻辑回归在许多领域都有广泛的应用&#xff0c;如医疗诊断、金融欺诈检测…

LLMs 可能在 2 年内彻底改变金融行业

在艾伦图灵研究所&#xff08;The Alan Turing Institute&#xff09;最新的一项研究中&#xff0c;我们看到了大型语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;的一种可能性。它有望通过检测欺诈行为、生成财务洞察以及自动化客户服务&#xff0c;…

Java的编程之旅44——学生信息管理系统

目录 1.MVC设计模式初探 文件结构的搭建 2.Student类用来初始化学生信息 3.主函数里的两个功能 1.调用初始化学生信息的功能 2.输出欢迎界面功能 4.Global类中方法的编写 5.StuPage类&#xff0c;StuCtrl类&#xff0c;StuModel类中方法的编写 1.查询功能 selStu方法的…

想要成为一名合格的软件测试工程师,你得会些啥?

对于很多新入行或者打算入行&#xff0c;成为软件测试工程师的小伙伴来说&#xff0c;刚开始接触这行&#xff0c;不知道自己究竟该学些什么&#xff0c;或者不知道必须掌握哪些知识&#xff0c;才能成为一名合格的测试工程师。 根据笔者观点&#xff0c;如果你能在学习过程中…

每日一题 第六十四期 洛谷 树状数组模板2

【模板】树状数组 2 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某区间每一个数加上 x x x&#xff1b; 求出某一个数的值。 输入格式 第一行包含两个整数 N N N、 M M M&#xff0c;分别表示该数列数字的个数和操作的总…

iOS17 隐私协议适配详解

1. 背景 网上搜了很多文章&#xff0c;总算有点头绪了。其实隐私清单最后做出来就是一个plist文件。找了几个常用三方已经配好的看了看&#xff0c;比着做就好了。 WWDC23 中关于隐私部分的更新&#xff08;WWDC23 隐私更新官网&#xff09;&#xff0c;其中提到了第三方 SDK 的…

简单而复杂的Python

Python是一种简单&复杂的编程语言。简单的时候可以到极致&#xff1a; print(hello world!)另一方面&#xff0c;Python 也具有许多复杂的语法特性&#xff0c;例如面向对象编程、装饰器、迭代器、生成器等等。这些特性使得 Python 适用于各种不同的编程任务和项目。 当我…

手撸一个简易 Grid 拖拽布局

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~ 以下文章来源于稀土掘金技术社区 &#xff0c;作者游仙好梦 最近有个需求需要实现自定义首页布局&#xff0c;需要将屏幕按照 6 列 4 行进行等分成多个格子&#xff0c;然后将组件可拖拽对应格子进行渲染展示。 对比…

实验:基于Red Hat Enterprise Linux系统的创建磁盘和磁盘分区(一)

目录 一. 实验目的 二. 实验内容 三. 实验设计描述及实验结果 fdisk [参数] [设备] 1. 为虚拟机添加1块大小为3-5G的硬盘nvme&#xff0c;将该硬盘划分1个主分区和两个逻辑分区分别为600MB。 partprobe [选项] [设备] 2. 将主分区格式化为ext4文件系统并挂载到/自己名字命名…

【QT入门】QWidget类的简单介绍

往期回顾&#xff1a; 【QT入门】 QListWidget各种常见用法详解之图标模式-CSDN博客 【QT入门】 QScrollArea实际运用之导航栏设计-CSDN博客 【QT入门】 QScrollArea实际运用之滑动Widget设计-CSDN博客 【QT入门】QWidget类的简单介绍 一、什么是QWidget QWidget 类是 Qt 框架…

二百二十九、离线数仓——离线数仓Hive从Kafka、MySQL到ClickHouse的完整开发流程

一、目的 为了整理离线数仓开发的全流程&#xff0c;算是温故知新吧 离线数仓的数据源是Kafka和MySQL数据库&#xff0c;Kafka存业务数据&#xff0c;MySQL存维度数据 采集工具是Kettle和Flume&#xff0c;Flume采集Kafka数据&#xff0c;Kettle采集MySQL数据 离线数仓是Hi…

python爬虫下载音乐

本文使用创作助手。 你可以使用Python的requests库来实现爬虫下载音乐。以下是一个简单的示例代码&#xff1a; import requestsdef download_music(url, file_path):response requests.get(url)with open(file_path, wb) as file:file.write(response.content)print(f"…

iOS苹果签名共享签名是什么以及如何获取?

哈喽&#xff0c;大家好呀&#xff0c;咕噜淼淼又来和大家见面啦&#xff0c;最近有很多朋友都来向我咨询共享签名iOS苹果IPA共享签名是什么&#xff0c;针对这个问题&#xff0c;淼淼来解答一下大家的疑惑并告诉大家iOS苹果ipa共享签名需要如何获取。 现在苹果签名在市场上的…

2024最新软件测试【测试理论+ 接口测试】面试题(内附答案)

一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段&#xff1a;需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样&#xff0c;之后我们会有一个需求澄清会议&#xff0c; …

加密/ 解密 PDF:使用Python为PDF文档设置、移除密码

在数字化时代&#xff0c;文档的安全性变得越来越重要。特别是对于包含敏感信息的PDF文件&#xff0c;确保其不被未经授权的人员访问或修改是至关重要的。本文将介绍如何使用Python在PDF文档中设置密码&#xff0c;以及如何移除已经设置的密码。 目录 PDF加密基础知识 Pytho…

蓝桥杯第1593题——二进制问题

题目描述 小蓝最近在学习二进制。他想知道 1 到 N 中有多少个数满足其二进制表示中恰好有 K 个 1。你能帮助他吗&#xff1f; 输入描述 输入一行包含两个整数 N 和 K。 输出描述 输出一个整数表示答案。 输入输出样例 示例 输入 7 2输出 3评测用例规模与约定 对于 30% …

如何解决redis里的大key问题

Redis中什么是Big Key&#xff08;大key&#xff09;问题&#xff1f;如何解决Big Key问题&#xff1f;_redis bigkey-CSDN博客

【SQL】1633. 各赛事的用户注册率(COUNT函数 表达式用法)

题目描述 leetcode题目&#xff1a;1633. 各赛事的用户注册率 Code select contest_id, round(count(*)/(select count(*) from Users)*100, 2) as percentage from Register group by contest_id order by percentage desc, contest_id ascCOUNT()函数 COUNT函数用法&#…

C语言联合体,枚举详解

1. 前言 前边我们已经了解了结构体在C语言当中是如何使用的&#xff0c;今天咱来一起聊一聊联合体与枚举在C语言当中又是如何运用的呢 2. 联合体的了解与运用 2.1 联合体的声明&#xff1a; 相比于结构体来说&#xff0c;联合体最大的区别就在于它是联合体当中所有成员共用一…