回文子串转二维dp的方式

目录

写在最前:

1. 首先我们要考虑一个问题:如何判断一个字符串是回文子串

2.如何创建dp[i][j]表示回文子串

3. 如何初始化?

4. 如何实现


问题引入:

LCR 020. 回文子串

给定一个字符串 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?

        ~~~ 方便解题,可以面对一系列的回文串的题目!

        ~~~ 算是一种比较好理解的答案。比起其他操作

        ~~~ 代码比较好记好背

写在最前:

对于设计到二维数组的遍历时,我们可以不要一下子就扎进代码里面。是要先理清楚他的遍历顺序和遍历的目的。为啥子要这样遍历。以及遍历的这个数组dp[i][j]代表的含义。不要一开始就研究当i=0时,j等于0,1,2。。。。这样往往会使我们陷入一些细节无法自拔。

1. 首先我们要考虑一个问题:如何判断一个字符串是回文子串

回文子串就是从左往右读和从右往左读相同的字符串。

2.如何创建dp[i][j]表示回文子串

比如s="abbab"

dp的长度是len(s)

dp[i][j]的含义:?

        dp[i][j]==1表示字符串s[i]到s[j]是回文串

动态转移方程式:

dp[i][j]==true  if dp[i+1][j-1]==true and s[i][j]

为什么是这个方程式?

不难理解对于子串s[1:6],只有当s[2,5]是回文子串时,并且s[1]==s[5]时才能构成回文子串。这里需要记住这个s[i]==s[j],当i==j时。

3. 如何初始化?

当i==j时,初始化dp[i][j]==true或者1,这样说可能有点抽象。当i==j时,s[i]与是[j]都表示同一字符。画个图 

dp
0(a)1(b)2(b)3(a)4(b)
0(a)1
1(b)1
2(b)1
3(a)1
4(b)1

        ---接着我们再初始化相邻元素相同的字符串aa,bb,cc这种,对于abbab,前两个b对应的赋值为1或true。

        ---初始化aba,bcb,opo这种,隔着一个元素左右两个元素是相同的回文串。这种初始化就是。

当s[i]==s[j] and j-i<2时,dp[i][j]==1或true。

[这里有一个需要注意的点:如果我们要统计的出现的回文子串的个数,我们不能重复统计,不能重复统计。比如dp[1][3]表示字符s[1]到s[3]是回文子串,就不能统计dp[3][1]是回文子串。也就是说我们只需要计算上三角矩阵或者下三角矩阵。

0(a)1(b)2(b)3(a)4(b)
0(a)111
1(b)1
2(b)11
3(a)1
4(b)1

4. 如何实现

我们可以实现这样的一种遍历方式:i是行,j是列。填完这个dp数组的顺序是这样

从1到15是遍历的顺序 。当然,你也可以有其他的遍历顺序,这个无所谓。 只要能理清楚为什么是只遍历一半的数组。

 只遍历右上三角的元素,遍历的范围从小到大。比如abbab

代码实现 

python版

def count_substrings(s):n = len(s)s_list = list(s)res = 0dp = [[0 for _ in range(n)] for _ in range(n)]for j in range(n):for i in range(j, -1, -1):print(f'j={j},i={i}')if s_list[i] == s_list[j] and ((j - i < 3) or dp[i + 1][j - 1]):dp[i][j] = Trueres += 1for i in dp:print(i)return res
count_substrings("abbab")

ps:对于不熟悉的朋友可以打印一下i,j的值来具体理解。

java版

public int countSubstrings(String s) {int n=s.length();char sChar[]=s.toCharArray();int res=0;boolean dp[][]=new boolean [n][n];for(int j=0; j<n; j++){for(int i=j;i>=0;i--){if(sChar[i]==sChar[j] && (j-i<3 || dp[i+1][j-1])) {dp[i][j]=true;res++;}}}return res;}

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

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

相关文章

Spring Boot入门指南:留言板

一.留言板 1.输⼊留⾔信息,点击提交.后端把数据存储起来. 2.⻚⾯展⽰输⼊的表⽩墙的信息 规范&#xff1a; 1.写一个类MessageInfo对象&#xff0c;添加构造方法 虽然有快捷键&#xff0c;但是还是不够偷懒 项目添加Lombok。 Lombok是⼀个Java⼯具库&#xff0c;通过添加注…

C语言 | Leetcode C语言题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; // 判断是否为完全平方数 bool isPerfectSquare(int x) {int y sqrt(x);return y * y x; }// 判断是否能表示为 4^k*(8m7) bool checkAnswer4(int x) {while (x % 4 0) {x / 4;}return x % 8 7; }int numSquares(int n) {if (isPerfect…

项目实战1(30小时精通C++和外挂实战)

项目实战1&#xff08;30小时精通C和外挂实战&#xff09; 01-MFC1-图标02-MFC2-按钮、调试、打开网页05-MFC5-checkbox及按钮绑定对象06--文件格式、OD序列号08-暴力破解09-CE10-秒杀僵尸 01-MFC1-图标 这个外挂只针对植物大战僵尸游戏 开发这个外挂&#xff0c;首先要将界面…

【SpringCloud】 微服务分布式环境下的事务问题,seata大合集

目录 微服务分布式环境下的事务问题 分布式事务 本地事务 BASE理论与强弱一致性 BASE理论 强弱一致性 常见分布式事务解决方案 - 2PC 常见分布式事务解决方案 - TCC 常见分布式事务解决方案 - 最大努力通知 常见分布式事务解决方案 - 最终一致性 Seata介绍与术语 Seata…

学习测试10-4自动化 web自动化

网页资源 链接: https://pan.baidu.com/s/17XL2c2lkw_R6BD–VnOQqw?pwd43dr 提取码: 43dr 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 框架之间切换 driver.switch_to.frame("idframe1") # 父切子 参数用id和name# 子切子必须先转回父 driver.sw…

【OpenCV C++20 学习笔记】操作图片

操作图片 概述图片的导入和保存对导入的图片的操作获取像素值Point类型和图片像素 内存管理和引用计数一些简便操作图片可视化更精确的类型转换 概述 在本专栏的第一篇文章中就介绍了一个用OpenCV处理图片的实例&#xff08;《图片处理基础》&#xff09;&#xff0c;这篇文章…

SQL injection UNION attacks SQL注入联合查询攻击

通过使用UNION关键字&#xff0c;拼接新的SQL语句从而获得额外的内容&#xff0c;例如 select a,b FROM table1 UNION select c,d FROM table2&#xff0c;可以一次性查询 2行数据&#xff0c;一行是a&#xff0c;b&#xff0c;一行是c&#xff0c;d。 UNION查询必须满足2个条…

实战解读:Llama Guard 3 Prompt Guard

前序研究&#xff1a;实战解读&#xff1a;Llama 3 安全性对抗分析 近日&#xff0c;腾讯朱雀实验室又针对 Llama 3.1 安全性做了进一步解读。 2024年7月23日晚&#xff0c;随着Llama3.1的发布&#xff0c;Meta正式提出了“Llama系统”的概念&#xff0c;通过系统级的安全组件对…

ansible基础讲解和加密文件讲解

ansible最重要的三个文件 /etc/ansible/ansible.cfg #####ansible的配置文件 /etc/ansible/host ##清单文件inventory ansible-navigator.yml ####以yml结尾的文件可以理解为conf结尾的文件&#xff0c;是配置文件&#xff0c;用于设置剧本playbook playbook讲解 以.yml结…

Java泛型理解这一篇就够了

好文推荐&#xff0c;请阅读此文&#xff1a;Java泛型最佳实践 总结&#xff1a; 泛型类 泛型接口 泛型函数 通配符 通配符是为了让Java泛型支持范围限定&#xff0c;这样使得泛型的灵活性提升&#xff0c;同时也让通用性设计有了更多的空间。 <?>&#xff1a;无界…

【SpringBoot】2 项目搭建

创建项目 1&#xff09;确实本地 jdk 版本 打开命令行窗口&#xff1a;快捷键 Windows R&#xff0c;输入 CMD&#xff0c;敲回车 执行命令&#xff1a;java -version 2&#xff09;在项目 clone 的位置创建 Spring Boot 项目&#xff0c;使用 Maven 进行依赖管理&#xff…

Python 机器学习求解 PDE 学习项目——PINN 求解二维 Poisson 方程

本文使用 TensorFlow 1.15 环境搭建深度神经网络&#xff08;PINN&#xff09;求解二维 Poisson 方程: 模型问题 − Δ u f in Ω , u g on Γ : ∂ Ω . \begin{align} -\Delta u & f \quad & \text{in } \Omega,\\ u & g \quad & \text{on } \Gamma:\p…

vue3 vxe-table 点击行,不显示选中状态,加上设置isCurrent: true就可以设置选中行的状态。

1、上个图&#xff0c;要实现这样的&#xff1a; Vxe Table v4.6 官方文档 2、使用 row-config.isCurrent 显示高亮行&#xff0c;当前行是唯一的&#xff1b;用户操作点击选项时会触发事件 current-change <template><div><p><vxe-button click"sel…

【个人记录】pkg可以将Node.js应用打包为可执行文件

背景 之前按客户需求做了一个简易定时任务应用&#xff0c;完成后为方便客户使用需要打包为可执行文件。 pkg工具 pkg 是一个非常流行的工具&#xff0c;它能够将 Node.js 应用打包成独立的可执行文件。它支持多个平台&#xff0c;包括 Windows、macOS 和 Linux。 测试环境…

【SpringBoot】 4 Thymeleaf

官网 https://www.thymeleaf.org/ 介绍 Thymeleaf 是一个适用于 Web 和独立环境的现代服务器端 Java 模板引擎。 模板引擎&#xff1a;为了使用户界面和业务数据分离而产生的&#xff0c;它可以生成特定格式的文档&#xff0c;用于网站的模板引擎会生成一个标准的 html 文档…

Hadoop单机版环境搭建

一 . 案例信息 Hadoop 的安装部署的模式一共有三种&#xff1a; 本地模式&#xff0c;默认的模式&#xff0c;无需运行任何守护进程&#xff08; daemon &#xff09;&#xff0c;所有程序都在单个 JVM 上执行。由 于在本机模式下测试和调试 MapReduce 程序较为方便&#x…

逻辑操作符 、||、!

逻辑操作符为提供逻辑判断的功能&#xff0c;能够构建更复杂的表达式所以有以下三种运算符 &#xff01;&#xff1a;逻辑取反运算符&#xff08;可以改变单个运算符的真假&#xff09;。 &&&#xff1a;逻辑与运算符&#xff0c;就是并且的意思。当两侧均为真的时候…

微信小程序之调查问卷

一、设计思路 1、界面 调查问卷又称调查表&#xff0c;是以问题的形式系统地记载调查内容的一种形式。微信小程序制作的调查问卷&#xff0c;可以在短时间内快速收集反馈信息。具体效果如下所示&#xff1a; 2、思路 此调查问卷采用服务器客户端的方式进行设计&#xff0c;服…

【CodinGame】趣味算法(教学用) CLASH OF CODE -20240726

文章目录 正文字符图形快乐蛇进度条 写在最后END 正文 字符图形 import math import sys# Auto-generated code below aims at helping you parse # the standard input according to the problem statement.zreb int(input())mylist [] for i in range(1, zreb):mylist.app…

Godot入门 03世界构建1.0版

在game场景&#xff0c;删除StaticBody2D节点&#xff0c;添加TileMap节点 添加TileSet图块集 添加TileSet源 拖动图片到图块&#xff0c;自动创建图块 使用橡皮擦擦除。取消橡皮擦后按住Shift创建大型图块。 进入选择模式&#xff0c;TileMap选择绘制&#xff0c;选中图块后在…