算法训练第五十七天 | LeetCode 647、516动态规划结尾

news2024/11/28 4:19:22

LeetCode 647回文子串

题目简析:

给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

思路分析:

本题的难点 主要在,思考dp定义以及遍历顺序,分析出几种情况

首先根据题目我们就给出dp定义

//dp[i][j]:区间[i,j]的串是为回文子串,注意是左闭右闭

由dp的定义决定我们使用的数组是boolean类型的

分析有几种情况:

//①首尾指向同一个字符(表示单个字符)
//②首尾中间间隔一个字符,也是回文子串(aba)
//③其余的情况:判断内部是否为回文子串(aabaa)

这个判断内部有点讲究,也决定了遍历顺序,内部,自然是[i+1,j-1],解释一下,即当发现首尾字符相同的时候,说明我们该判断当前区间的串是否为回文子串了

首尾没超过三,举例(单个字符:a,三个字符:aba),可以发现都是回文串

而如果首尾长度超过3,说明我们需要判断内部是否为回文子串

举例(aabaa,aabca)

因此dp[i][j] = dp[i+1][j-1],发现当前位是由它左下角来推出的

//即当前位置的左下角,那么就是从左下角开始往右上角推算dp
//一定要从下到上,从左到右遍历,这样保证dp[i + 1][j - 1]都是经过计算的
    public int countSubstrings(String s) {
        int len = s.length();
        boolean[][] dp = new boolean[len][len];
        int res = 0;
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < len; j++) {
                if (s.charAt(i) == s.charAt(j)) {
                    if (j - i <= 1) {
                        res++;
                        dp[i][j] = true;
                    }
                    else if (dp[i + 1][j - 1]) {
                        //表示区间内部:i+1,j-1
                        res++;
                        dp[i][j] = true;
                    }
                }
            }
        }
        return res;
    }

还有一种双指针的方法,就作为了解咯,从中心往外推有几个回文串,有两种情况,中心有一个字符,中心有两个字符

    public int countSubstrings(String s) {
        int len, ans = 0;
        if (s == null || (len = s.length()) < 1) return 0;
        //总共有2 * len - 1个中心点
        for (int i = 0; i < 2 * len - 1; i++) {
            int left = i / 2, right = left + i % 2;
            while (left >= 0 && right < len && s.charAt(left) == s.charAt(right)) {
                //如果当前是一个回文串,则记录数量
                ans++;
                left--;
                right++;
            }
        }
        return ans;
    }

LeetCode 516最长回文子序列

题目简析;

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

思路分析:

首先要记清楚子序列定义,不改变相对顺序的情况下,不要求连续

按照步骤分析清楚,有了上面一题的启发,这题dp定义,遍历顺序没有那么难想

//dp[i][j]:字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j]。
//画图看方程,找状态,由上一题的启发,我们判断回文串应该从内部开始判断
//首尾相同的时候,从内部开始判断
//遍历顺序,由dp方程可以看见,当前位由左下角退出,或者左,或者下
//因此得由下往上,由左往右推
//j不从i开始是因为,dp方程决定,两者永远不会指向同一个字符

本题难点倒是dp方程的推导,以及最后的返回结果(由遍历顺序可以决定返回值一定是右上角)

dp的推导也是由上一题的启发,应该从中间往两边推,这里把代码随想录的图拿过来了 

    public int longestPalindromeSubseq(String s) {
        int len = s.length();
        //将区间对应下标会好理解,+1
        int [][]dp = new int[len+1][len+1];
        //初始化:单个字符,即首尾相同,指向同一单个字符的情况,一定是回文子序列,
        // 全初始为1
        for (int i = 0; i < len; i++) {//其实就是对角线
            dp[i][i] = 1;
        }
        for (int i = len-1; i >= 0; i--) {
            for (int j = i+1; j < len; j++) {
                if(s.charAt(i)==s.charAt(j)){
                    //首尾相等,内部+2
                    dp[i][j] = dp[i+1][j-1] + 2;
                }else{
                    //首尾不等:找左边或右边最大
                    dp[i][j] = Math.max(dp[i+1][j],dp[i][j-1]);
                }
            }
        }
        return dp[0][len - 1];
    }

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

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

相关文章

【Aptos与Sui智能合约】(Move长话短说) #03 - 智能合约编写与发布

前言:本篇学习如何在Aptos上发布两个自定义的智能合约 0x1 前置条件 安装好Aptos工具,MacOS、Ubuntu、Windows系统的预编译的安装包下载地址 https://github.com/aptos-labs/aptos-core/releases?q=cli&expanded=true 想自己从源码开始编译,你就下载Source Code 安装…

千万不要把Request传递到异步线程里面,有坑

前几天在网上冲浪的时候看到一篇技术文章&#xff0c;讲的是他把一个 request 请求传递到了线程池里面&#xff0c;然后遇到了一个匪夷所思的情况。 他写了这篇文章&#xff0c;把自己针对这个问题的探索过程分享了出来&#xff1a; 《springboot 中如何正确的在异步线程中使用…

艾美捷脂质过氧化检测试剂盒参数说明和文献参考

脂质过氧化的定量对于评估氧化损伤在病理生理学疾病中的作用至关重要。脂质过氧化导致饱和和不饱和脂质的高反应性和不稳定的氢过氧化物的形成。 艾美捷脂质过氧化检测试剂盒直接利用与亚铁离子的氧化还原反应测量过氧化氢&#xff0c;将脂质过氧化氢提取到氯仿中&#xff0c;提…

【python绘制地图——folium的方法和类的介绍(思维导图)】

Python使用folium制作地图并生成png图片 第一章 folium的方法和类的介绍&#xff08;思维导图&#xff09; 第二章 使用folium制作地图 第三章 folium实用功能进阶 第三章 使用Html2Image生成png图片 第四章 使用reportlab制作pdf报告 文章目录Python使用folium制作地图并生成…

轮廓图编程-自定义QChartView

目录 一、功能需求 二、实现效果 三、实现方法 一、功能需求 3D测量软件中&#xff0c;需要在轮廓上进行二次编程&#xff0c;需要显示轮廓线&#xff0c;然后可以调节矩形框的范围的获取参数&#xff0c;如华汉的HyperShape3D软件&#xff0c;对轮廓的编程界面如下。 二、实…

【Java基础知识复盘】String、StringBuffer、StringBuilder篇——持续更新中

本人知识复盘系列的博客并非全部原创&#xff0c;大部分摘自网络&#xff0c;只是为了记录在自己的博客方便查阅&#xff0c;往后也会陆续在本篇博客更新本人查阅到的新的知识点&#xff0c;望悉知&#xff01; String类 在 Java 中字符串属于对象&#xff0c;Java 提供了 Str…

《融合视觉显著性和局部熵的红外弱小目标检测》论文复现

1.复现论文概要 复现的论文为《融合视觉显著性和局部熵的红外弱小目标检测》&#xff08;赵鹏鹏&#xff0c;李庶中等&#xff0c;中国光学2022&#xff0c;http://www.chineseoptics.net.cn/cn/article/doi/10.37188/CO.2021-0170&#xff0c;以下简称论文&#xff09;。论文…

【库存控制】基于象鼻虫损害优化算法求解库存控制问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

交换机的结构特点及主要功能

什么是交换机&#xff1f; Switch 意为“交换机”&#xff0c;是一种用于转发电 ( 光 ) 信号的网络设备。它可以为访问交换机的任意两个网络节点提供专用的电信号路径。非常常见的 是以太网交换机。其他常见的有电话语音交换机、光纤交换机等。 它的工作原理是什么&#xff1f…

美国藤校Top30大学对IB成绩的要求

众所周知&#xff0c;IB体系是目前全球认可度比较高的国际课程。那么&#xff0c;用IBDP成绩申请美国TOP30大学需要什么样的成绩&#xff1f; 小智今天来带大家好好研究下美国TOP30大学对IB成绩的要求。普林斯顿大学 Princeton University 普林斯顿大学对于IB成绩没有具体要求&…

nginx架构解析:朴实中见真知

目录前言为什么高并发很重要Apache可以做到吗使用nginx会更有优势吗&#xff1f;nginx架构概览代码结构Workers模型nginx进程规则nginx缓存概览nginx配置nginx内部典型的HTTP请求处理循环课程总结前言 nginx&#xff08;发音“engine x”&#xff09;是俄国的软件工程师Igor S…

Godzilla(哥斯拉)安装与使用

Godzilla安装与使用1.Godzilla介绍2.Godzliia下载与安装2.1.Godzilla下载2.2.运行环境2.3.Godzilla安装2.3.1.执行文件2.3.2.安装完成3.Godzliia3.1.Godzliia使用3.1.1.生成木马3.1.2.存储木马3.1.3.放入木马3.1.4.访问木马3.1.5.连接木马3.1.6.测试连接3.1.7.连接进入3.2.Godz…

麒麟水乡,IU酒店进驻云南旅游咽喉之地曲靖

曲靖位于云南省东北部&#xff0c;是云南连接内地的重要陆路通道&#xff0c;素有“滇黔锁钥”、“入滇门户”、“云南咽喉”之称&#xff0c;是仅次于昆明的云南第二大城市。曾入选“中国十佳宜居城市”榜单10次的城市&#xff0c;拥有3000多年的文明史&#xff0c;早在三国魏…

Python解题 - CSDN周赛第17期 - 拯救公主

本期又出现了题目测试数据的问题&#xff0c;而且题目和算法关系也不太大&#xff0c;基本就属于用代码代替手工解答算术题的感觉。不禁让人怀疑官方题库是否已经没有高质量的题了&#xff0c;同时也怀疑长期满分却又不更新博客拿奖品的某位选手是不是托。。。 第一题&#xff…

VS系列多通道振弦传感器无线采发仪与参数配置工具连接

VS101~VS432 设备配备了专门的参数配置工具 SETP 来完成设备工作参数的查看和修改工作。 连接前的准备工作 &#xff08;1&#xff09;数据接口与计算机连接 使用标配的通讯线与计算机 RS232 接口连接。若需基于手机网络发送数据&#xff0c;请在开机前安装 SIM 卡。 若…

D. Lucky Chains(GCD+素数筛)

input: 4 5 15 13 37 8 9 10009 20000output: 0 1 -1 79题目大意&#xff1a; 如果一个数对(x,y)是幸运的&#xff0c;当且仅当gcd(x,y)1,一条链可以由以下规律的数对组成&#xff0c;(x,y),(x1,y1),(x2,y2)……(xk,yk)&#xff0c;如果说一条链是幸运的&#xff0c;当且仅当…

非零基础自学Golang 第16章 正则表达式 16.3 regexp包 16.4 小结 16.5 知识拓展

非零基础自学Golang 文章目录非零基础自学Golang第16章 正则表达式16.3 regexp包16.3.1 MatchString函数16.3.2 FindStringIndex函数16.3.3 ReplaceAllString函数16.4 小结16.5 知识拓展16.5.1 常用正则表达式参考第16章 正则表达式 16.3 regexp包 Go在处理正则表达式时主要使…

拆箱phper最适合入门的go框架beego

beego beego 是一个快速开发 Go 应用的 HTTP 框架&#xff0c;他可以用来快速开发 API、Web 及后端服务等各种应用&#xff0c;是一个 RESTful 的框架&#xff0c;主要设计灵感来源于 tornado、sinatra 和 flask 这三个框架&#xff0c;但是结合了 Go 本身的一些特性&#xff…

路由信息协议RIP(计算机网络)

目录 路由选择协议 路由信息协议 RIP中的距离 RIP协议的具体算法 RIP协议路由表的更新 例题 距离向量算法 RIP 协议的要点 路由选择协议 路由器之间要互相不断交换网络拓扑和状态信息&#xff0c;根据信息求出到所有目的网络的最佳路由 用于交换路由信息&#xff0c;进…

软件测试实战教程系列—接口测试用例和报告模板|收藏版

文章目录 接口测试为什么会如此重要呢&#xff1f; 接口测试的必要性 获取接口相关信息 接口测试的流程 接口文档 是接口测试的参照&#xff0c;至少包括&#xff1a; 接口测试用例设计 接口测试用例模板 &#xff08;可根据项目实际情况设计增减&#xff09; 接口测试…