算法刷题|647.回文子串、516.最长回文子序列

news2024/11/26 0:39:44

回文子串

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

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

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

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

  • dp[i][j] 表示[i,j]范围内的字符串是否是回文字符串
  • 递推公式:判断s.charAt(i) 和 s.charAt(j)是否相等
    • 相等:如果i==j,说明只有一个字符,肯定是回文,例如a;如果j-1 = i,说明只有两个字符,并且相等,也肯定是回文,例如aa;如果j-1>i,这时候就需要判断i+1到j-1的范围是否是回文了
      回文子串
    • 不相等:那肯定就不是了
  • dp数组初始化:默认全是false
  • 遍历顺序:我们的dp[i][j]主要是由于dp[i+1][j-1]推导出来的,所有我们应该先从大到小遍历i,然后从小到大遍历j
    回文子串遍历顺序
  • 打印dp数组
class Solution {
    public int countSubstrings(String s) {
        // dp[i][j] 表示[i,j]范围内的字符串是否是回文字符串
        boolean[][] dp = new boolean[s.length()][s.length()];
        // 初始化 dp[i][j] = false;
        // 记录结果
        int res = 0;
        for(int i = s.length()-1;i>=0;i--){
            for(int j = i;j<s.length();j++){// 根据dp定义知道j是大于i的所以这里j至少需要从i开始
                if(s.charAt(i) == s.charAt(j)){
                    if(j-i<=1){
                        dp[i][j] = true;
                        res++;
                    }else{
                        if(dp[i+1][j-1]){
                            dp[i][j] = true;
                            res++;
                        }
                    }
                }
            }
        }
        return res;
    }
}

最长回文子序列

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

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

思路:本题和上一题的最大的区别在于,上一题求的是子字符串(必须连续),本题是子序列(可以不连续)

  • dp[i][j]表示[i,j]范围内的字符串中最长回文子序列的最大长度为dp[i][j]
  • 递推公式:s.charAt(i) 和 s.charAt(j)是否相等
    • 相等:dp[i][j] = dp[i+1][j-1] + 2;因为是左右两个字符,所有加2
    • 不相等:dp[i][j] = Math.max(dp[i+1][j],dp[i][j-1]);
      • 保留j位置字符:dp[i+1][j]
      • 保留i位置字符:dp[i][j-1]
        最长回文子序列
  • dp初始化: dp[i][i] = 1,因为当i=j的时候就是只有一个字符,一个字符也是回文子序列,长度为1
  • 遍历顺序:本题和上题一样
  • 打印dp
class Solution {
    public int longestPalindromeSubseq(String s) {
        // dp[i][j]表示[i,j]范围内的字符串中最长回文子序列的最大长度为dp[i][j]
        int[][] dp = new int[s.length()][s.length()];
        // 初始化 dp[i][i] = 1
        for(int i = 0;i<s.length();i++){
            dp[i][i] = 1;
        }
        for(int i = s.length()-1;i>=0;i--){
            // 为什么j从i+1开始,因为j=i这种情况我们已经在初始化的时候处理过了
            for(int j = i+1;j<s.length();j++){
                if(s.charAt(i) == s.charAt(j)){
                    dp[i][j] = dp[i+1][j-1] + 2;
                }else{
                    // dp[i+1][j] 保留j位置的字符
                    // dp[i][j-1] 保留i位置的字符
                    dp[i][j] = Math.max(dp[i+1][j],dp[i][j-1]);
                }
            }
        }
        return dp[0][s.length()-1];
    }
}

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

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

相关文章

【redis】redis分布式锁(三)自动续期

系列文章目录 【redis】redis分布式锁&#xff08;一&#xff09;手写分布式锁1.0~6.0 【redis】redis分布式锁&#xff08;二&#xff09;可重入锁设计模式 文章目录 系列文章目录前言一、CAPredis集群 APZooKeeper集群 CP 数据一致性Eureak集群 APnacos集群 AP 二、lua脚本脚…

1 认识仿真工具Packet Tracer【实验】【计算机网络】

1 认识仿真工具Packet Tracer【实验】【计算机网络】 前言推荐1 认识仿真工具Packet Tracer1.1账号注册与Packet Tracer软件下载1.1.1 下载1.1.2 安装 1.2 Packet Tracer界面简介1.2.1 总述1.2.2 详细 1.3网络拓扑构建与设备模块添加1.3.1如何往工作区中添加设备1.3.2添加连线1…

【计算机网络】1.1——因特网概述

因特网概述&#xff08;了解&#xff09; 网络、互联网和因特网 网络由若干结点和连接这些结点的链路组成 多个网络还可以通过路由器互连起来&#xff0c;互联网是"网络的网络“ internet 和 Internet internet&#xff08;互联网或互连网&#xff09;是通用名词 泛指…

Java 基础入门篇(四)——— 方法的重载与参数传递机制

文章目录 一、方法的定义二、方法的参数传递机制 ★2.1 基本类型的参数传递2.2 引用类型的参数传递 三、方法重载 一、方法的定义 方法的作用&#xff1a;封装一段代码的语法结构&#xff0c;可以被重复调用&#xff0c;以此提高代码的复用性&#xff0c;提高开发效率&#xf…

操作系统之线程

线程 一、产生原因 最开始的并发&#xff0c;只能更具切换进程的方式去交替执行进程来宏观上并发&#xff0c;但是切换进程需要切换执行进程的环境&#xff0c;有很大的系统开销&#xff0c;所以产生了线程&#xff0c;让其可以不用频繁的切换进程&#xff0c;使得线程成为CPU…

【论文笔记 fintune 】羊驼

1.论文 这些开发由两个关键组件提供动力&#xff1a;大型预训练语言模型&#xff08;LM&#xff09;和人工编写的指令数据。 1.1 背景 目前的训练太吃数据了&#xff0c;需要使用一些替代方法减少对数据的依赖有微调过的数据集效果远好于没有微调 用什么数据集微调呢&#x…

Collaborative Metric Learning(www 2017)

Background 传统基于MF的模型&#xff0c;将特征向量的点积作为预测结果&#xff0c;这存在一个很大的问题&#xff0c;即dot product 不满足三角不等式&#xff09;&#xff0c;这会导致学到的特征向量次优&#xff08;难以捕捉用户细粒度的偏好&#xff09;。本文提出了一种…

【Java笔试强训 20】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;字符串反…

第十八章 协程

我们知道脚本都是继承自MonoBehaviour类&#xff0c;而其中的Update方法里面放置了大部分的游戏逻辑处理代码。Update方法是游戏循环的每一帧都去执行&#xff0c;这就要求我们的代码“无时无刻”不在处理所有的可能发生的情况&#xff0c;并做出相应的处理。如果我们想要完成“…

Vue之render函数

概述 render函数从名字上看就可以看出&#xff0c;它是一个用于渲染的函数&#xff0c;在Vue中我们要将我们写的界面展示到屏幕上时&#xff0c;使用的方式都是组件中的template:标签下编写内容后&#xff0c;由Vue将我们编写的界面渲染到屏幕上。而这个render函数就是比templ…

B. Divide Candies(数学 + 思维)

Problem - B - Codeforces Arkady和他的朋友们喜欢在一个n n的棋盘上玩跳棋。这个棋盘的行和列从1到n编号。 他的朋友们最近赢了一场比赛&#xff0c;所以Actady想用一些糖果来取悦他们。记得一则古老寓言(但不记得寓意)》&#xff0c;Arlady想给他的朋友们每个格子一个糖果组…

SpringMVC学习总结(一)SpringMVC简介入门案例

SpringMVC学习总结&#xff08;一&#xff09;SpringMVC简介/入门案例 一、SpringMVC简介 &#xff08;一&#xff09;什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分。 M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的Ja…

手把手教你学会gitee的注册和代码的提交

欢迎来到壮壮的代码世界 gitee的注册和提交 一、gitee是什么&#xff1f;二、gitee怎么注册三、gitee的一些基本配置四、在gitee上创建远程仓库&#xff08;存储代码的地方&#xff09;五、clone远程仓库到本地电脑六、怎么把本地的代码推送到远程仓库去&#xff08;git的三板斧…

jQuery操作

文章目录 1. jQuery基本介绍1.1 原理示意图1.2 快速入门1.2 什么是jquery对象1.3 dom对象转jQuery对象1.4 jQuery对象转dom对象1.5 jQuery选择器1.5.1 jQuery基本选择器1.5.2 jquery层次选择器1.5.3 基础过滤选择器1.5.4 内容过滤选择器1.5.5 可见度过滤选择器1.5.6 属性过滤选…

Vue(Vue脚手架)

一、使用Vue脚手架&#xff08;Vue Cli&#xff09; Vue官方提供脚手架平台选择最新版本&#xff1a; 可以相加兼容的标准化开发工具&#xff08;开发平台&#xff09; 禁止&#xff1a;最新的开发技术版本和比较旧版本的开发平台 Vue CLI&#x1f6e0;️ Vue.js 开发的标准工…

AWS VPC 配置指南:快速创建和设置你的虚拟私有云

文章目录 一、前言二、创建 VPC2.1 进入 AWS VPC 服务2.2 创建 VPC2.3 选择所要创建的 VPC 资源2.4 输入 VPC 名称2.5 设置 IPv4 CIDR block&#xff08;IPv4 CIDR 块&#xff09;2.6 选择可用区2.7 选择公有子网的数量2.8 设置 NAT 网关和 VPC 终端节点2.9 完成创建 VPC2.10 查…

python ast 详解与用法

目录 基本概念节点类型ast.Assignast.Nameast.Constantast.Callast.Attribute 结点的遍历ast源码示例 结点的修改示例 参考链接 基本概念 python 语言在编译前会解析为抽象语法树&#xff0c;整个文件可以看作一棵树&#xff0c;树上的每个节点就代表一条语句&#xff0c;中序…

计算机中找不到msvcp140.dll无法继续执行代码,解决方法

DLL是Dynamic Link Library的缩写&#xff0c;意为动态链接库。dll文件是电脑系统及软件运行的重要文件&#xff0c;电脑如果丢失dll文件&#xff0c;那么很多软件跟游戏都是无法运行的&#xff0c;msvcp140.dll丢失这个问题就有很多小伙伴遇到&#xff0c;小编今天就分享找不到…

山东专升本计算机第一章-计算机信息技术与计算机文化

计算机信息技术与计算机文化 计算机中的信息表示 数制及其转换 数制&#xff1a;用进位的原则进行计数数码&#xff1a;数制中表示基本数值大小的不同数字符号基数&#xff1a;一种数制所使用的数码个数位权&#xff1a;数码在不同位置的权值 数制的转换 • R进制转化为十进…

【操作系统和强化学习】1.内存管理策略

文章目录 前言1.内存是什么1.1 基本硬件保护措施 碎片1.2 分段机制1.2.1 分段硬件1.3 分页 前言 CPU的调度可以提高CPU的利用率和计算机的响应用户的速度。为了改进性能&#xff0c;应该将多个进程保存在内存中。也就是说必须共享内存。 本文讨论的是如管理内存。 1.内存是什么…