算法训练营Day48

#Java #动态规划

Feeling and experiences:

回文子串:力扣题目链接

给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。

回文字符串 是正着读和倒过来读一样的字符串。

子字符串 是字符串中的由连续字符组成的一个序列。

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

示例 1:

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

动态规划在 回文子串上的运用

之前做回文子串的问题,一般会用到 双指针 和 回溯

class Solution {public int countSubstrings(String s) {int n = s.length();  // 字符串的长度int ans = 0;  // 记录回文子串的个数for (int i = 0; i < 2 * n - 1; ++i) {int l = i / 2, r = i / 2 + i % 2;  // 根据奇偶性确定回文中心的左右边界while (l >= 0 && r < n && s.charAt(l) == s.charAt(r)) {--l;  // 向左扩展++r;  // 向右扩展++ans;  // 找到一个新的回文子串}}return ans;  // 返回最终的回文子串个数}
}

双指针的 思路很简单:

就是遍历每个可能的中心点,然后我们从 中心点 用两个指针开始遍历元素,判断是否为回文

至于 中心点 为什么是 2*n - 1 个:

来自力扣评论中的一条解释):

为什么是2n-1个中心点?

如果回文串是奇数,我们把回文串中心的那个字符叫做中心点,如果回文串是偶数我们就把中间的那两个字符叫做中心点

对于一个长度为n的字符串,我们可以用它的任意一个字符当做中心点,所以中心点的个数是n。我们还可以用它任意挨着的两个字符当做中心点,所以中心点是n-1,总的中心点就是2*n-1

动态规划的做法:

class Solution {public int countSubstrings(String s) {int len = s.length();boolean[][] dp = new boolean[len][len];  // dp[i][j] 表示从索引 i 到 j 的子串是否为回文int result = 0;  // 记录回文子串的个数for (int i = len - 1; i >= 0; i--) {for (int j = i; j < len; j++) {if (s.charAt(i) == s.charAt(j)) {if (j - i <= 1) {result++;  // 单个字符或相邻字符相同,是回文子串dp[i][j] = true;} else if (dp[i + 1][j - 1]) { result++;  // 利用动态规划,如果内部子串是回文,则整个子串也是回文dp[i][j] = true;}}}}return result;}
}
  • 使用动态规划数组 dp,其中 dp[i][j] 表示从索引 ij 的子串是否为回文。

  • 从字符串的最后一个字符开始,逆序遍历到第一个字符。这样可以确保在计算 dp[i][j] 时,dp[i+1][j-1] 已经被计算过,以便利用动态规划的结果。

  • 在每个位置 (i, j),检查字符 s.charAt(i)s.charAt(j) 是否相同,如果相同,判断子串是否为回文:

    • 如果 j - i 小于等于 1,说明子串长度为 1 或 2,一定是回文,此时增加回文子串的计数。
    • 如果 j - i 大于 1,利用动态规划的结果,如果内部子串是回文,则整个子串也是回文,同样增加回文子串的计数。

最长回文子序列:力扣题目链接

给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。

子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

示例 1:

输入:s = "bbbab"
输出:4
解释:一个可能的最长回文子序列为 "bbbb" 。

该题和 子串问题差不多

class Solution {public int longestPalindromeSubseq(String s) {// 本题是子序列问题,和子串问题类似// 创建dp数组,定义:区间[i,j] 左闭右闭 最大的回文子序列为dp[i][j]int[][] dp = new int[s.length()][s.length()];// 初始化为 java 默认为0// 循环,遍历for (int i = s.length() - 1; i >= 0; i--) {for (int j = i; j < s.length(); j++) {if (s.charAt(i) == s.charAt(j)) {if (j - i <= 1) {dp[i][j] = j - i + 1;} else {dp[i][j] = dp[i + 1][j - 1] + 2;}} else {dp[i][j] = Math.max(dp[i + 1][j], Math.max(dp[i][j - 1], dp[i][j]));}}}return dp[0][s.length() - 1];}
}
  • 从字符串的末尾开始循环,外层循环变量为 i,内层循环变量为 j。这样可以确保在计算 dp[i][j] 时,dp[i+1][j-1] 已经被计算过,以便利用动态规划的结果。

  • 对于每一对索引 (i, j),如果 s[i]s[j] 相等,那么:

    • 如果 j - i 小于等于 1,说明子串长度为 1 或 2,直接赋值 dp[i][j] = j - i + 1
    • 否则,利用动态规划的结果,dp[i][j] = dp[i + 1][j - 1] + 2
  • 如果 s[i]s[j] 不相等,那么 dp[i][j] 取左边、上边和左上角三个位置的最大值,即 dp[i][j] = Math.max(dp[i + 1][j], Math.max(dp[i][j - 1], dp[i][j]))

风不定,人初静,明日落红应满径。

Fighting!

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

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

相关文章

《Windows核心编程》若干知识点实战应用分享

目录 1、进程的虚拟内存分区与小于0x10000的小地址内存区 1.1、进程的虚拟内存分区 1.2、小于0x10000的小地址内存区 2、保存线程上下文的CONTEXT结构体 3、从汇编代码角度去理解多线程运行过程的典型实例 4、调用TerminateThread强制结束线程会导致线程中的资源没有释放…

WPF之鼠标快速移动进出Textbox导致联动的控件显示卡顿解决方案

如果你的应用在鼠标快速移动进出TextBox1时出现卡顿或者TextBox2的MessInfo显示失败&#xff0c;可能是由于频繁的UI线程更新引起的。你可以试试以下的一些解决方案&#xff1a; 使用防抖动/节流技术&#xff1a;防抖和节流是两种常用的控制函数调用频率的技术&#xff0c;防抖…

Redisson 分布式锁可重入的原理

目录 1. 使用 Redis 实现分布式锁存在的问题 2. Redisson 的分布式锁解决不可重入问题的原理 1. 使用 Redis 实现分布式锁存在的问题 不可重入&#xff1a;同一个线程无法两次 / 多次获取锁举例 method1 执行需要获取锁method2 执行也需要&#xff08;同一把&#xff09;锁如…

Python map函数

在Python编程中&#xff0c;map()函数是一个强大的工具&#xff0c;用于将函数应用于可迭代对象&#xff08;如列表、元组等&#xff09;的每个元素&#xff0c;然后返回一个新的可迭代对象&#xff0c;其中包含应用函数后的结果。本文将深入探讨map()函数的用法&#xff0c;提…

云计算项目五:部署数据库服务mysql |部署共享存储服务NFS | 配置网站服务

部署数据库服务mysql |部署共享存储服务NFS | 配置网站服务 案例1:配置逻辑卷步骤一:创建LV步骤二:格式化案例2:配置数据库服务器步骤一:安装软件MySQL服务软件(2台数据库服务器都要安装)步骤二:挂载lv设备步骤三:启动服务步骤四:管理员登录案例3:配置主从同步步骤一…

linuxshell日常脚本命令之if判断

shell脚本if中判断大于、小于、等于、不等于的符号 脚本有问题&#xff0c;有没有哪位大佬能帮忙检查一下&#xff1f; #!/bin/bash#run_num$(squeue | grep shifting | wc -l) run_numsqueue | grep shifting | wc -l #run_num$(squeue | grep shifting | wc -l 2>&1…

vue+draggable+el-upload上传图片拖拽重排方法

vuedraggableel-upload上传图片拖拽重排方法 1.html <el-row><el-col><el-form-item label"添加视频/图片" prop"device_id"><div class"image-upload"><draggable v-model"fileList" update"dataDr…

js树形控件zTree使用总结

文章目录 一、zTree简介1.1、zTree的特点1.2、zTree文件介绍 二、zTree的基本使用2.1、zTree的创建2.2、zTree的配置2.3、zTree的数据格式2.3.1、标准数据格式2.3.2、简单数据格式 2.4、zTree的常用方法2.4.1、获取zTree对象2.4.2、增加节点2.4.3、勾选或取消勾选全部节点2.4.4…

ubuntu 添加 sudo 权限

xxxx 不在 sudoers 文件中。此事将被报告。 在Ubuntu中&#xff0c;可以通过将用户添加到sudo组来为其提供sudo&#xff08;超级用户&#xff09;权限。 要添加sudo权限&#xff0c;按照以下步骤操作&#xff1a; 打开终端&#xff08;CtrlAltT&#xff09;。 输入以下命令并…

使用 git rebase 合并多个 commit

首先我们查看一下当前提交历史&#xff1a; atreus-MBP:code (test) $ git log -4 --oneline da3ba01 (HEAD -> test) 3 9d2725f 2 44f23cb 1 61e7d87 (origin/test) merge: Merge branch test of https://gitee.com/atreus1125/code into test我们通过 git rebase -i 61e7…

怎么选专业!!!!

最基础的专业能锻炼你的最核心的技能。至于工作中要用到的知识&#xff0c;在工作中去学习&#xff0c;效果最好。 第二个迷思是&#xff1a;最热门的专业就是最好的专业????。 家长和老师经常会跟孩子们说&#xff0c;你们要想好将来干什么&#xff0c;找个好的专业。有人…

【知识---git中一些常用的命令及其选项】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; Git 提供了许多选项&#xff0c;以满足不同的需求和操作。以下是一些常见的 Git …

视频汇聚/云存储平台EasyCVR级联上级播放后一直发流是什么原因?

可视化云监控平台/安防视频监控系统EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;同时…

【Web前端实操12】将一个100*100的盒子,变成圆形

将一个100*100的盒子&#xff0c;变成圆形&#xff0c;是一个简单的实操&#xff0c;想要完成这个实操&#xff0c;最关键的是一个知识点&#xff0c;使用 CSS3 border-radius 属性&#xff0c;你可以给任何元素制作 "圆角" border-radius 属性&#xff0c;可以使用…

软考复习之软件工程篇

软件生命周期 问题定义&#xff1a;要示系统分析员与用户进行交流&#xff0c;弄清”用户需要计算机解决什么问题”然后提出关于“系统目标与范围的说明”&#xff0c;提交用户审查和确认 可行性研究&#xff1a;一方面在于把待开发的系统的目标以明确的语言描述出来&#xf…

【Linux】shell外壳和权限

文章目录 shell外壳用户切换权限 shell外壳 什么是shell外壳呢&#xff1f;首先我们应该知道&#xff0c;用户和操作系统内核是不能直接接触的&#xff0c;因为首先操作系统本身就很难去操作&#xff0c;另一方面也是为了操作系统安全考虑&#xff0c;不能让用户直接去操作内核…

JeecgBoot 3.6.1实现Modal对话框,以为审核数据为例

JeecgBoot 3.6.1实现Modal对话框 vue使用的是3.0版本 文章目录 JeecgBoot 3.6.1实现Modal对话框前言一、列表页面关键代码示例二、textAuditModal.vue代码示例三、test.api.ts总结 前言 在工作中&#xff0c;有一个需求&#xff0c;要求&#xff0c;在数据列表页&#xff0c;…

SUBMIT指定用户名错误

1、SUBMIT说明 在ABAP中&#xff0c;SUBMIT关键字用于运行另一个ABAP程序。通过SUBMIT关键字&#xff0c;可以在当前程序内部调用其他程序&#xff0c;而无需关闭当前程序。 SUBMIT语句的一般语法如下&#xff1a; "--------------------斌将军-------------------- SUB…

Java接收curl发出的中文请求无法解析

最近做项目遇到了这种情况&#xff0c;Java接收curl发出的中文请求无法解析&#xff0c;英文请求一切正常&#xff0c;中文请求则对方服务器无法解析&#xff0c;可以猜测是中文导致的编码问题&#xff0c;但是奇怪的是&#xff0c;本地输出json也没有乱码&#xff0c;编解码正…

leetcode:三数之和---双指针

问题&#xff1a; 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复…