最长回文子串-双下标动态规划

news2024/11/25 16:36:54

题目来源:Leetcode 5.最长回文子串
在这里插入图片描述

DP定义:

容易想到,用一个二维数字dp[i][j]来表示s[i:j]是否是回文串,如s=“daba”。dp[1][3]=1表示"aba"为回文串;

递归条件

想要判断字符串"aba"是否为回文串,只要判断字符串首和尾字符串相同"a"==“a”,并且中间的字符串"b"为回文串即可。

//如果坐标i和j的字符相同,并且夹在中间的字符串s[i:j]为回文串
if(s.charAt(i)==s.charAt(j)  && dp[i-1][j-1]=1){
		dp[i][j]=1;
}

代码

这里有一点需要注意,平常的双层递归都是用i,j作为左右边界遍历即可,如:

for(int i=0;i<len;i++){
    for(int j=i+1;j<len;j++){
		// i是字符串左边界,j是右边界
	}
}

但是这里不能这样遍历。考虑字符串"aaa",依次遍历过程:dp[0][1]=1…dp[0][2]=1 dp[0][3]=0 不正确
因为dp[0][3]是需要依据dp[1][2]的值的,然而dp[1][2]还没有比较。可以发现,较长的字符串会依赖较短的字符串,所以这里应该去枚举子串的长度,再去遍历左边界。

 public String longestPalindrome(String s) {
        int resLen = -1;
        String res=s.substring(0,1);//默认答案为串的第一个字符,因为一个字符一定是回文串
        //判断串的长度为1/2的特殊情况 
        if(s.length()<=1) return s;
        if(s.length()==2){
            return s.charAt(0)==s.charAt(1)?s:s.substring(0,1);
        }
        int[][] dp =new int[s.length()+1][s.length()+1];
        for(int i=1;i<=s.length();i++) dp[i][i]=1; //dp[i:i]都是回文串
        //按照子串长度来遍历,如果不按照长度遍历会出现 "aaaa"判断dp[0:4]时dp[1:3]还没有初始化
        for(int len=2;len<=s.length();len++){
            //枚举左节点
            for(int i=0;i<s.length()-1;i++){
                if(i+len-1 >=s.length()){
                    //越界
                    break;
                }
                //判断s[i: i+len-1]是否是回文串
                int j = i+len-1;//右端点
                //两端相同,则去判断中间的串是否是回文串。
                if(s.charAt(i)==s.charAt(j)){
                    //串长度为2 或 3(一定是回文串) ,或者 dp[i+1][j-1]==1
                    if(j==i+1||j==i+2||dp[i+1][j-1]==1){
                        dp[i][j]=1;
                        //如果长度比之前的最大长度更长,则更新
                        if(j-i+1 >resLen){
                            resLen = j-i+1;
                            res=s.substring(i,j+1);
                        }
                    }
                }
            }
        }

        return res;
    }

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

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

相关文章

MySQL--事务(详解)

目录 一、前言二、本文章目标三、什么是事务&#xff1f;四、事务的ACID特性五、为什么要使用事务六、如何使用事务6.1 查看支持使用事务的引擎6.2语法6.3 开启⼀个事务&#xff0c;执行更新后回滚6.4 开启一个事务更新后提交6.5 保存点6.6 自动/手动提交事务 七、事务的隔离性…

X86、ARM架构镜像

1. 简介 ARM 镜像和 x86 镜像是为不同处理器架构设计的软件镜像。ARM&#xff08;Advanced RISC Machine&#xff09;架构和 x86 架构是两种主流的处理器指令集架构&#xff0c;它们在设计和性能特点上有所不同。以下是 ARM 镜像和 x86 镜像的一些主要区别&#xff1a; 处理器架…

LangGraph入门(一)为什么要用LangGraph

阅读langgraph文档后编写&#xff0c;原文链接 https://langchain-ai.github.io/langgraph/concepts/high_level/ agent介绍 大语音模型LLMs是非常强大的&#xff0c;特别是LLMs与外部API或者检索数据库结合时&#xff0c;将使得的大模型如虎添翼。所以&#xff0c;在调用LLM之…

xss-labs靶场第六关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、注入点寻找 2、使用hackbar进行payload测试 3、绕过结果 四、源代码分析 五、结论 一、测试环境 1、系统环境 渗透机&#xff1a;本机(127.0.0.1) 靶 机&#xff1a;本机(127.0.0.…

使用通义千问模拟ChatGPT-o1进行思考,并以类似于ChatGPT-o1的形式输出

prompt 你是ChatGPT O1&#xff0c;旨在通过第一性原理思维和基于证据的推理来解决用户问题。你的目标是提供清晰、循序渐进的解决方案、基础概念&#xff0c;并从头开始构建答案。 ### 指导原则&#xff1a; 以下是为大模型采用这种方法而设计的系统提示&#xff1a; 1. 理解…

LeetCode | 69.x的平方根

这道题很适合用二分来解决&#xff0c;算是二门入门的一个练手题吧思想就是首先设置两个指针&#xff0c;一个是0&#xff0c;一个是x&#xff0c;相当于在数轴上划定一个区域 [ 0 , x ]然后计算数轴中间值和我们想要找的值的大小关系&#xff0c;因为数轴是有序的&#xff0c;…

汉诺塔问题递归与非递归实现

汉诺塔问题描述 问题&#xff1a;有三根柱子&#xff08;A、B、C&#xff09;和若干个不同大小的盘子&#xff0c;最初所有盘子都在柱子 A 上&#xff0c;按大小顺序从上到下排列。目标是将所有盘子移动到柱子 C 上&#xff0c;遵循以下规则&#xff1a; 每次只能移动一个盘子…

Leetcode 在排序数组中查找元素的第一个和最后一个位置

这段代码的目的是在一个有序的数组中查找目标元素的第一个和最后一个位置。如果目标元素不存在&#xff0c;返回 [-1, -1]。算法要求时间复杂度为 O(log n)&#xff0c;所以使用了二分查找的思想。 主要思路&#xff1a; 使用两次二分查找&#xff1a; 第一次二分查找用于找到…

《OpenCV计算机视觉》—— 人脸识别

识别图片如下&#xff1a; 完整代码&#xff1a; import cv2image cv2.imread(face.png) gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) """ 加载分类器 """ faceCascade cv2.CascadeClassifier(haarcascade_frontalface_default.xml) &…

UE5 使用Animation Budget Allocator优化角色动画性能

Animation Budget Allocator是UE内置插件&#xff0c;通过锁定动画系统所占CPU的预算&#xff0c;在到达预算计算量时对动画进行限制与优化。 开启Animation Budget Allocator需要让蒙皮Mesh使用特定的组件&#xff0c;并进行一些编辑器设置即可开启。 1.开启Animation Budget…

浏览器指纹原理及技术实现探索

文章目录 [TOC](文章目录) 前言一、什么是浏览器指纹&#xff1f;二、浏览器指纹的作用三、 浏览器指纹如何保证唯一性四、浏览器指纹的隐私问题五、如何应对浏览器指纹&#xff1f;六、目前常用的技术方案七、技术实现探索1、简易方式2、fingerprintjs2方式 八、总结 前言 在…

国家药包材标准数据库在线查询方法<实用篇>

从业于医药相关的包材行业这么多年&#xff0c;对于许多医药行业的生产企业、药品检验机构、药品注册申请人以及医疗机构的朋友而言&#xff0c;查询国家药包材标准是他们日常工作的一部分&#xff0c;相对容易。然而&#xff0c;对于那些刚进入这个行业的新手或者普通大众来说…

【测试】自动化——常用函数

元素的定位 查找元素&#xff1a;find_element(方式&#xff0c;“元素”)&#xff0c;表示查找一个元素&#xff1b; find_element(方式&#xff0c;“元素”)&#xff0c;表示查找多个元素。 ###使用查找多个元素 ChromeInsChromeDriverManager().install() driverwebdriv…

uniapp学习(005-2 详解Part.2)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第41p-第p51的内容 文章目录 mainifest.json文件配置获取微信小程序appid注册微信小程序微信小程序控制台图形界…

Linux 命令:每日一学,文件查找之find命令实践

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 0x00 前言简述 描述&#xff1a;前面我们一些学习了Linux文件内容查看、分隔列、排序、统计等命令&#xff0c;相信认真学习实践过的看友都已经初步掌握了吧&#xff0c;今天我们继续学习下Linux中…

本地生活服务项目入局方案解析!本地生活服务商系统能实现怎样的作业效果?

当前&#xff0c;各大平台的本地生活服务业务日渐兴盛&#xff0c;提高创业者入局意向的同时&#xff0c;也让本地生活服务项目有哪些等问题也成为了多个创业者社群中的热议对象。而从目前的讨论情况来看&#xff0c;在创业者们所询问的众多本地生活服务项目中&#xff0c;通过…

从二维到三维,电商行业有哪些变化?

从二维到三维&#xff0c;电商行业经历了一系列显著的变化&#xff0c;这些变化不仅体现在商品展示的方式上&#xff0c;还深刻影响了消费者的购物体验、电商平台的运营策略以及整个电商行业的竞争格局。 一、商品展示方式的变革 二维展示阶段&#xff1a; 在电商行业的早期&…

一键安装与配置Stable Diffusion,轻松实现AI绘画

随着技术的迭代&#xff0c;目前 Stable Diffusion 已经能够生成非常艺术化的图片了&#xff0c;完全有赶超人类的架势&#xff0c;已经有不少工作被这类服务替代&#xff0c;比如制作一个 logo 图片&#xff0c;画一张虚拟老婆照片&#xff0c;画质堪比相机。 最新 Stable Di…

kubernetes(K8s)学习(一)

本文主要是搭建一个k8s平台&#xff0c;并部署一个springboot的jar包&#xff0c;后续以此作为学习k8s的环境。 1. 搭建k8s集群 网上有很多指导&#xff0c;大家可以在网上搜索一下&#xff0c;比如这个&#xff1a;K8s搭建集群-CSDN博客&#xff0c;本人通过VMware安装3台虚拟…

国外电商系统开发-运维系统操作脚本

查看脚本内容&#xff0c;只需要点击即可&#xff1a; 执行脚本&#xff0c;请点击 点击了下一步后&#xff0c;可以输出脚本参数&#xff0c;当然你可以可以不输入&#xff0c;直接下一步就行&#xff1a; 现在&#xff0c;点击【下一步】执行开始出初始化脚本&#xff1a; …