当前位置: 首页 > news >正文

最长回文子串(动规 + 中心拓展)

目录

  • [BM73 最长回文子串](https://www.nowcoder.com/practice/b4525d1d84934cf280439aeecc36f4af?tpId=295&tags=&title=&difficulty=0&judgeStatus=0&rp=0&sourceUrl=/exam/oj?questionJobId=10&subTabName=online_coding_page)
    • 1. 动态规划
      • (1)状态表示:
      • (2)状态转移方程
      • (3)初始化
      • (4)填表顺序
      • (5)返回值
    • 2. 中心拓展算法

BM73 最长回文子串

1. 动态规划

能够将所有的子串是否是回文的信息,保存在dp表里面.
时间/空间复杂度都是: O(n*n)

(1)状态表示:

首先我们这样想,如何表示出所有的子串?
我们假设 i 为子串的起始位置, j 为子串的结束位置,那我们就可以暴力枚举出所有的子串.当枚举完一个子串后, j 就不用从头开始了, 因为这时的子串和之前是一样的, 枚举下一个子串时 j 直接从 i 的位置开始即可.

暴力枚举的过程用两层for循环即可完成, 即用一个二维的dp表. 在二维dp表中,用横坐标表示起始位置 i ,用纵坐标表示结束位置 j .

如下图分析可知, 我们只需要使用dp表的上三角(i<=j) 部分即可:
在这里插入图片描述
在dp表中填上 true 或 false 即可知道该子串是否是回文了.

dp[i][j]表示: s 字符串 [i, j] 区间的子串是否是回文串.

(2)状态转移方程

要是回文串,首尾字符必须相同吧, 所以根据 s[i] 和 s[j] 的关系进行推导:
(1) s[i] != s[j], dp[i][j] = false
(2) s[i] == s[j] 时又有三种情况:
a. i==j 只有一个字符,是回文, dp[i][j] = true
b. i+1 = j 是相邻的, 也是回文, dp[i][j] = true
c. i 和 j 之间有别的字符了,则要去 [i+1, j-1] 的区间找了,即 dp[i+1][j-1], 如果它是 true, 则 dp[i][j] 是true, 否则 dp[i][j] 是 false.

(3)初始化

对 dp表 进行初始化时为了在后续填表时避免越界, 此时有可能会越界的是 dp[i+1][j-1].
当 i 和 j 相等或是 i 和 j 相邻的时候, 再进行 i + 1 和 j - 1 后, j > i 了, 但是我们在前面已经分析过了,使用的是dp表的上三角(i<=j), 此时不符合条件了. 但是其实这里是不会越界的, 因为会越界的两种情况就是上述分析的 a,b 两种情况, 已经特判过了.
所以, 可以不用进行初始化.

(4)填表顺序

我们填 (i, j) 位置时要用到 (i+1, j-1) 位置, 所以填表顺序整体是从下往上填写每一行.

(5)返回值

在 dp表 中是 true 的位置就是回文串, 知道了回文串的起始位置和结束位置, 一定可以计算出最长回文串的长度.

代码实现如下:

class Solution 
{
public:int getLongestPalindrome(string A) {//动态规划(n*n / n*n)//能够将所有的子串是否是回文的信息,保存在dp表里//dp[i][j]表示: s 字符串 [i,  j] 的子串是否是回文串.int n = A.size();vector<vector<bool>> dp(n, vector<bool>(n));int ret = 0;for(int i = n-1; i >= 0; i--){for(int j = i; j < n; j++) //注意: j >= i {//第一种情况: A[i] != A[j], 初始化默认是false//把后面三种情况合并在一起if(A[i] == A[j])dp[i][j] = i + 1 < j ? dp[i+1][j-1] : true;if(dp[i][j])ret = max(ret, j - i + 1);}}return ret;}
};

2. 中心拓展算法

中心拓展就是使用两个变量表示子串的起始位置和结束位置, 同时进行向左向右扩展, 这个过程可以分为奇数次扩展和偶数次扩展, 在计算出两种扩展的最大值即可.
时间复杂度: O(n)
空间复杂度: O(1)
在这里插入图片描述

代码实现如下:

class Solution 
{
public:int getLongestPalindrome(string A) {int n = A.size();int len = 1;//中心拓展算法(n*n / 1)//从下标为1的地方开始遍历for(int i = 1; i < n; i++){// 奇数次扩int left = i - 1, right = i + 1;while(left >= 0 && right < n && A[left] == A[right]){left --;right++;}len = max(len, right - left - 1);// 偶数次扩left = i - 1, right = i;while(left >= 0 && right < n && A[left] == A[right]){left --;right++;}len = max(len, right - left - 1);}return len;
};

相关文章:

最长回文子串(动规 + 中心拓展)

目录 [BM73 最长回文子串](https://www.nowcoder.com/practice/b4525d1d84934cf280439aeecc36f4af?tpId295&tags&title&difficulty0&judgeStatus0&rp0&sourceUrl/exam/oj?questionJobId10&subTabNameonline_coding_page)1. 动态规划(1)状态表示:…...

学习海康VisionMaster之亮度测量

一&#xff1a;进一步学习了 今天学习下VisionMaster中的亮度测量&#xff1a;这个和前面学习的都不一样了&#xff0c;这个是测量ROI区域内的平均亮度等 1&#xff1a;什么是亮度测量&#xff1f; 我们工业上用的相机里面有一个感光芯片&#xff08;CCD/CMOS&#xff09;&…...

LeetCode 238:除自身以外数组的乘积(Java实现)

文章目录 **题目描述**解决思路1. 两次遍历法&#xff08;左右乘积法&#xff09;2. 核心思想 Java代码实现复杂度分析示例说明步骤分解 注意事项总结 题目描述 给定一个整数数组 nums&#xff0c;返回一个数组 answer&#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外…...

LintCode第23题-判断数字与字母字符 第145题-大小写转换 第283题-三数之中的最大值

思路: 直接使用包装类的方法来判断 比如: isLetter(char c)判断是否是字母&#xff08;包括大小写、非英语字母也行&#xff09; isDigit(char c)判断是否是数字&#xff08;0~9&#xff09; isLetterOrDigit(char c)是否是字母或数字&#xff08;等价于 isLetter isLower…...

Visual Studio 项目转Qt项目

1. 先确保qmake 和 minGW &#xff08;g&#xff09; 路径都在系统变量内&#xff1b;或者通过WinR -> cmd 来检测&#xff0c; 如果能够 显示qmake 的信息 &#xff0c; g 的信息 &#xff0c; 就说明设置环境变量成功。 2. 打开项目文件夹&#xff0c;在这里打开cmd, 换…...

判断字符是否唯一 --- 位运算

目录 一&#xff1a;题目 二&#xff1a;算法与原理 三&#xff1a;代码分析 一&#xff1a;题目 题目链接&#xff1a;面试题 01.01. 判定字符是否唯一 - 力扣&#xff08;LeetCode&#xff09; 二&#xff1a;算法与原理 三&#xff1a;代码分析 class Solution { publ…...

react路由使用方法

react路由常用方法 一、router安装与基础路由二、路由跳转三、路由参数四、路由嵌套无论是小程序端、web端还是移动端前端开发都需要使用到路由组件,学会了路由之后便可以灵活开发各种交互页面。可以说路由在前端开发中占有非常重要的位置。在React中,路由使用方式和Vue比较相…...

Wannier90文件与参数

Wannier90源码https://github.com/wannier-developers/wannier90/releases/tag/v3.1.0 用法 Wannier90 可以以两种模式运行&#xff1a; 后处理模式 Post-processing mode&#xff1a;从文件中读取第一性原理代码计算得到的重叠和投影。我们预计这是使用 wannier90 最常见的…...

学习黑客Nmap 原理

练气期第一重 — 神识探查术&#xff08;Nmap 原理&#xff09; 场景设定 诸位道友&#xff08;学生&#xff09;刚踏入信息安全修真界&#xff0c;手中只有一柄“网路灵剑”&#xff08;本地终端&#xff09;。想要探知远处服务器的灵脉&#xff08;端口&#xff09;、功法&am…...

VBA信息获取与处理专题五:VBA利用CDO发送电子邮件

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…...

Git 第一讲---基础篇 git基础概念与操作

前言&#xff1a; Git&#xff0c;作为目前全球最流行的分布式版本控制系统&#xff0c;以其高效、灵活和强大的分支管理能力&#xff0c;成为开发者手中不可或缺的工具。从个人开源项目到企业级应用&#xff0c;Git的身影无处不在。然而&#xff0c;对初学者而言&#xff0c;…...

心衰生物标志物NT-ProBNP和BNP

B型利钠肽&#xff08;BNP&#xff09;和N末端B型利钠肽原&#xff08;NT-proBNP&#xff09;都属于利尿钠肽&#xff08;NP&#xff09;家族。当发生心衰时&#xff0c;NT-ProBNP和BNP的浓度会升高&#xff0c;它们是心衰&#xff08;HF&#xff09;和心功能障碍诊疗中应用最广…...

Winform(11.案例讲解1)

今天写两个案例,用于更好的理解控件的使用 在写之前先写一个类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _1.案例讲解 { internal class Student { public string …...

卡尔曼滤波详解

1. 卡尔曼滤波能解决什么问题&#xff1f; 卡尔曼滤波用于解决含噪声的动态系统状态估计问题&#xff0c;例如&#xff1a; 通过GPS和IMU数据估计车辆位置 通过电压电流测量估计电池电量(SOC) 雷达追踪飞行器轨迹 它的核心优势是&#xff1a; 递归计算&#xff1a;只需前一…...

数据类型:String

String目录 SetGetMsetMgetIncrIncrbySubstrGetrangeSetrange String是字符串类型&#xff0c; redis给我们提供了String类型的value&#xff0c; 但是内部的实现一共有三种&#xff1a; int、embstr、raw&#xff1b; 三种的不同之处在于当value长度较小的时候使用embstr和int…...

【C/C++】inline关键词

C inline 关键字学习笔记 一、什么是 inline 函数&#xff1f; inline&#xff08;内联&#xff09;是 C 中的一个关键字&#xff0c;表示“将函数的代码直接插入到调用点”&#xff0c;以减少函数调用开销&#xff0c;提升执行效率。 ✅ 注意&#xff1a;inline 是一种“请求…...

Hive安装与配置教程

Hive安装与配置教程 1. 环境准备 1.1 系统要求 Java 8或更高版本Hadoop 2.x或更高版本MySQL或其他关系型数据库&#xff08;用于存储元数据&#xff09; 1.2 安装依赖 # 安装Java sudo apt update sudo apt install openjdk-8-jdk# 安装MySQL sudo apt install mysql-serv…...

C++负载均衡远程调用学习之获取主机信息功能

目录 01Lars-lbAgentV0.2-赋值均衡数据结构关系分析 02 Lars-lbAgent0.2-host_info-load_balance-route_lb数据结构的定义 03Lars-lbAgentV0.2-proto协议的定义 04 Lars-lbAgentV0.2-route_lb与UDP server的关联 05 -Lars-lbAgentV0.2-route_lb与UDP server的关联 06Lars…...

C++ 适配器模式详解

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许不兼容的接口之间能够协同工作。 概念解析 适配器模式的核心思想是&#xff1a; 接口转换&#xff1a;将一个类的接口转换成客户希望的另一个接口 兼容性&#xff1a;使原本由于接…...

2025.5.5总结

今日感悟&#xff1a;这假期就这样结束了&#xff0c;玩了一次滑板&#xff0c;打扫了一次租房&#xff0c;出去逛了一次街&#xff0c;看完了一本书&#xff0c;追了一部剧。既没有家人&#xff0c;也没有能一同畅饮的同学&#xff0c;更没有对象&#xff0c;显得确实有些孤独…...

数据链路层(MAC 地址)

目录 一、前言&#xff1a; 二、以太网&#xff1a; 三、MAC 地址的作用&#xff1a; 四、ARP协议&#xff1a; 一、前言&#xff1a; 数据链路层主要负责相邻两个节点之间的数据传输&#xff0c;其中&#xff0c;最常见数据链路层的协议有 以太网&#xff08;通过光纤 / 网…...

kotlin 05flow -从 LiveData 迁移到 Kotlin Flow 完整教程

一 从 LiveData 迁移到 Kotlin Flow 完整教程 LiveData 长期以来是 Android 架构组件中状态管理的核心&#xff0c;但随着 Kotlin Flow 的成熟&#xff0c;Google 官方推荐将现有 LiveData 迁移到 Flow。本教程基于官方文章并扩展实践细节&#xff0c;完成平滑迁移。 一、为什…...

PostgreSQL 的 pg_ls_waldir 函数

PostgreSQL 的 pg_ls_waldir 函数 pg_ls_waldir 是 PostgreSQL 中用于列出预写式日志(WAL)目录内容的重要函数&#xff0c;特别适用于 WAL 文件管理和数据库恢复场景。 一、函数基本说明 语法 pg_ls_waldir() RETURNS SETOF text功能 返回 WAL 目录中所有文件的名称集合在…...

形式化数学——Lean求值表达式

作为学习 Lean 的程序员&#xff0c;最重要的是理解求值的工作原理。求值是求得表达式的值的过程&#xff0c;就 像算术那样。例如&#xff0c;15 - 6 的值为 9&#xff0c;2 (3 1) 的值为 8。要得到后一个表达式的值&#xff0c;首先将 3 1 替换为 4&#xff0c;得到 2 4&…...

杰理-AC696音箱linein无法插入检测

杰理-AC696音箱linein无法插入检测 阻值选用1k&#xff0c;原公版原理图上68k,导致内部上拉电压一直不能掉下来&#xff0c;软件一直无法检测到。...

zst-2001 历年真题 程序设计语言

程序设计语言1 b 程序设计语言2 c 程序设计语言3 a 程序设计语言4 b中解释语言可以用高级语言编写 c优化 d反了 a 程序设计语言5 c 程序设计语言6 重复就是循环 b 程序设计语言7 a 程序设计语言8 c就是malloc&#xff0c;动态扩展数组&#xff0c;和类型没什…...

VirtualBox调整虚拟机内存和CPU

当我们配置的虚拟机内存或CPU不足以支撑开发需要时&#xff0c;需要及时调整内存和CPU大小。调整前如果虚拟机在运行&#xff0c;需要先关机。 下面的步骤是居于VirtualBox 6.1版本&#xff0c;不同版本的操作界面会有些许差异。 1.选中要调整的虚拟机&#xff0c;点击设置 2…...

SpringMVC框架详解与实践指南

文章目录 一、三层架构与MVC模型1. 三层架构2. MVC模型 二、SpringMVC入门案例1. 环境搭建2. 核心配置3. 编写Controller 三、执行流程与组件分析四、RequestMapping注解五、请求参数绑定1. 基本类型与对象绑定2. 嵌套对象与集合绑定 六、中文乱码解决方案(前端传到后端)1. Str…...

C语言 ——— 函数

目录 函数是什么 库函数 学习使用 strcpy 库函数 自定义函数 写一个函数能找出两个整数中的最大值 写一个函数交换两个整型变量的内容 牛刀小试 写一个函数判断一个整数是否是素数 写一个函数判断某一年是否是闰年 写一个函数&#xff0c;实现一个整型有序数组的二分…...

洛谷 P9007 [入门赛 #9] 最澄澈的空与海 (Hard Version)

这道题可不入门。 [Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] 给定 n n n&#xff0c;求有多少组 ( x , y , z ) (x,y,z) (x,y,z) 满足&#xff1a; x − y z n ! x-\dfrac{y}{z}n! x−zy​n! x − y z n ! n \dfrac{x-y…...

Java基础学完,继续深耕(0505)Linux 常用命令

昨天休息了一天&#xff0c;没有写csdn 昨天和今天把Linux大概学了一下。总结一下常用命令&#xff0c;总结的不全。 Linux目录结构 / 是所有目录的顶点 目录结构像一颗倒挂的树 注意&#xff1a;/itheima 是绝对路径&#xff0c;是指根目录 / 下的itheima目录 itheima…...

详解 FFMPEG 交叉编译 `FLAGS` 和 `INCLUDES` 的作用

FLAGS 和 INCLUDES这两行是 Android NDK 编译时的编译器选项&#xff0c;用于控制代码生成、优化、调试、安全性和头文件搜索路径。下面逐项详解&#xff1a; 1. FLAGS 详解&#xff08;编译器选项&#xff09; FLAGS 定义了传递给 C/C 编译器&#xff08;如 clang 或 gcc&…...

DGI数据治理框架的最佳实践

以下是针对DGI数据治理框架的最佳实践推荐&#xff0c;结合其核心理念与实际应用场景&#xff0c;帮助组织高效落地数据治理&#xff0c;释放数据价值。 一、组织架构与角色分工 最佳实践1&#xff1a;建立清晰的数据治理委员会 • 实践要点&#xff1a; • 由高层领导&#…...

C++类与对象深度解析:从基础到应用

目录&#xff1a; 1. 类的基本概念与定义1.1 类的定义与访问限定符1.2 实例化与对象内存布局1.3 this指针 2.类的默认成员函数2.1 构造函数与析构函数详解构造函数析构函数 2.2 拷贝构造函数2.3 赋值运算符重载运算符重载 3. 初始化列表4.类型转换5. 静态成员6.友元和内部类6.1…...

JGQ611Ⅱ数据采集电除雾器实验装置

JGQ611Ⅱ数据采集电除雾器实验装置 一.实验目的 1.掌握电除雾器的结构特征与工作原理。 2.测定风压、风速、电压、电流板间距等因素对酸雾去除效率的影响。 3.测定电除雾器的工作效率。 二.技术指标 1.电场电压&#xff1a;0&#xff5e;20KV&#xff08;可调&#xff09;。 2.…...

如何判断cgroup的版本?

在 Linux 系统中&#xff0c;判断当前使用的 cgroup 版本&#xff08;v1 还是 v2&#xff09;可以通过以下几种方法&#xff1a; 方法一&#xff1a;查看挂载点&#xff08;最直接&#xff09; mount | grep cgroup输出分析 cgroups v1&#xff1a;存在多个以 cgroup 开头的…...

基于 Spark 和 Hadoop 的空气质量数据分析与预测系统

基于 Spark 和 Hadoop 的空气质量数据分析与预测系统 文章目录 基于 Spark 和 Hadoop 的空气质量数据分析与预测系统引言项目目标技术栈数据来源系统核心功能1. 用户认证与管理2. 数据总览3. 空气质量分析4. 词云图5. AQI 预测 项目结构预览关键代码分享1. Flask 主文件&#x…...

qt csv文件写操作

实例1&#xff1a; QStringList header; header << "1" << "2"; QStringList footer; footer << "Here is a footer"; QStringList strList; strList << "one" << "two" <&l…...

Java 反射

反射 反射的概述 获取class对象的三种方式 代码实现 package myreflect1;public class MyReflectDemo1 {public static void main(String[] args) throws ClassNotFoundException {//1.第一种方式//全类名&#xff1a;包名类名//最为常用Class clazz1 Class.forName("…...

Spring-使用Java的方式配置Spring

目录 前言 一、使用Java配置Spring 前言 使用纯Java的配置方式&#xff0c;在SpringBoot中随处可见&#xff0c;是必须要学习的 一、使用Java配置Spring 配置Spring有多种方式&#xff0c;我们现在要完全不使用Spring的xml配置了&#xff0c;全权交给Java来做&#xff01; J…...

cudaMalloc函数说明

cudaMalloc函数说明 cudaError_t cudaMalloc(void** devPtr, size_t size);参数说明 devPtr (输出参数): 类型为 void**&#xff0c;即指向指针的指针。函数执行成功后&#xff0c;*devPtr 将被赋值为 GPU 内存的起始地址。例如&#xff1a;若分配一个 float 数组&#xff0c;需…...

路由协议(静态路由、RIP、OSPF、BGP)

目录 静态路由 RIP OSP BGP 总结 静态路由 定义&#xff1a;由网络管理员手动配置的路由。它不会自动更新&#xff0c;除非管理员手动修改。 特点&#xff1a; 简单&#xff1a;配置简单&#xff0c;适合小型网络。安全&#xff1a;不会与其他路由器交换路由信息&#x…...

基于 HTML5 的贪吃蛇小游戏实现

一、引言 在 Web 开发的世界中&#xff0c;利用 HTML、CSS 和 JavaScript 构建有趣的互动游戏是一项充满乐趣和挑战的任务。本文将详细介绍一个基于 HTML5 的贪吃蛇小游戏的实现过程&#xff0c;通过对代码的解析&#xff0c;带你了解如何打造一个经典的贪吃蛇游戏&#xff0c…...

学习Linux的第二天

如何在Linux环境下做开发 Linux的一些基操 Tips&#xff1a;平常最表层的是命令行模式&#xff0c;最多见这个默认叫做命令行模式 Vi操作是什么意思呢 就是在提示符输入vi a.c 是可以创建一个a.c这个文件并进入这个输入模式 按i可以输入代码 要退出的时候按esc 再按:(冒号…...

rollout 是什么:机器学习(强化学习)领域

rollout 是什么:机器学习(强化学习)领域 指从特定初始状态开始,按照某个策略或模型进行一系列动作和状态转移,直到达到终止状态或预定时间步数 。比如: 迷宫任务:强化学习代理在迷宫中,从起始点出发,按某策略(如随机选方向走)进行移动,直到找到出口或达到最大移动…...

MATLAB人工大猩猩部队GTO优化CNN-LSTM多变量时间序列预测

本博客来源于CSDN机器鱼&#xff0c;未同意任何人转载。 更多内容&#xff0c;欢迎点击本专栏目录&#xff0c;查看更多内容。 目录 0 引言 1 数据准备 2 CNN-LSTM模型搭建 3 GTO超参数优化 3.1 GTO函数极值寻优 3.2 GTO优化CNN-LSTM超参数 3.3 主程序 4 结语 0 引言…...

android-ndk开发(3): 连接设备到开发机

android-ndk开发(3): 连接设备到开发机 2025/05/05 1. 术语解释 用来写代码的电脑&#xff0c; 我叫做开发机。 我打心底认为 Windows, Linux, macOS 都是 PC&#xff0c; 但是有些人不这么认为&#xff0c; 那就还是叫开发机。 android 手机能运行 app&#xff08;众所周知…...

谷歌最新推出的Gemini 2.5 Flash人工智能模型因其安全性能相较前代产品出现下滑

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Kubernetes排错(七)-节点排错

1、节点 Crash 与 Vmcore 分析 kdump 介绍​ 目前大多 Linux 发新版都会默认开启 kdump 服务&#xff0c;以方便在内核崩溃的时候, 可以通过 kdump 服务提供的 kexec 机制快速的启用保留在内存中的第二个内核来收集并转储内核崩溃的日志信息(vmcore 等文件), 这种机制需要服务…...

《架构安全原则》解锁架构安全新密码

The Open Group最新发布的《架构安全原则》标准中文版为企业架构、技术架构、解决方案架构以及安全架构领域的专业人员提供了一套系统化、可落地的安全设计准则。这一权威文件旨在帮助组织在数字化转型的复杂环境中构建既安全又敏捷的架构体系&#xff0c;其内容与TOGAF标准、N…...