LeetCode-Golang之【5. 最长回文子串】

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。

示例 2:
输入: “cbbd”
输出: “bb”

本算法采用 动态规划去解析

func longestPalindrome(s string) string {n :=len(s)dp :=make([][]int,n)for i:=0;i<n;i++{dp[i] = make([]int,n)}ans := ""for k:=0;k<n;k++{for i:=0;i+k<n;i++{j:=i+kif k == 0 {dp[i][j] = 1}else if k == 1 {if s[i] == s[j] {dp[i][j] = 1}}else {if s[i] == s[j] {dp[i][j] = dp[i+1][j-1]}   }if dp[i][j] == 1 && k+1 > len(ans){ans = s[i:j+1]}}}return ans
}

代码解析:

  1. 初始化二维 DP 表格

n := len(s)
dp := make([][]int, n)
for i := 0; i < n; i++ {dp[i] = make([]int, n)
}

功能:

dp[i][j] 表示子串 s[i:j+1] 是否是回文子串。值为 1 表示是回文,0 表示不是。
初始化一个大小为 n × n 的二维数组 dp,用于存储所有子串的回文状态。
2. 遍历子串长度 k(主循环)

for k := 0; k < n; k++ {for i := 0; i+k < n; i++ {j := i + k...}
}

功能:

遍历所有可能的子串长度 k(k+1 是实际长度)。
i 是子串的起始位置,j = i + k 是子串的结束位置。
子串的范围是 s[i:j+1]。
3. 判断子串是否是回文

if k == 0 {dp[i][j] = 1
} else if k == 1 {if s[i] == s[j] {dp[i][j] = 1}
} else {if s[i] == s[j] {dp[i][j] = dp[i+1][j-1]}
}

功能:

根据子串长度的不同情况,判断是否为回文:
长度为 1(k == 0):
单个字符总是回文,直接标记为 1。
长度为 2(k == 1):
如果两个字符相等,则是回文。
长度大于 2(k > 1):
首尾字符相等,且去掉首尾的子串 s[i+1:j] 也为回文(通过 dp[i+1][j-1] 判断)。

  1. 更新答案
if dp[i][j] == 1 && k+1 > len(ans) {ans = s[i : j+1]
}

功能:

如果当前子串 s[i:j+1] 是回文且长度超过当前记录的最长回文,则更新答案 ans。
k+1 是子串的实际长度。

完整运行流程示例
假设输入字符串为 s = “babad”:

初始化 dp 矩阵为全 0,ans = “”。
遍历所有可能的子串:
子串长度 k = 0:
每个单字符都是回文,如 dp[0][0] = 1,dp[1][1] = 1。
子串长度 k = 1:
检查相邻字符是否相等。如 s[0:2] = “ba” 不是回文,但 s[1:3] = “aba” 是回文。
子串长度 k = 2:
检查三字符回文,通过 dp[i+1][j-1] 判断。
每次找到更长的回文时,更新答案。
最终结果为 “bab” 或 “aba”。

复杂度分析
时间复杂度:O(n²)
遍历子串的起点 i 和长度 k。
空间复杂度:O(n²)
使用了一个二维数组 dp 存储状态。

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

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

相关文章

音频数据采样入门详解 - 给Python初学者的简单解释

音频数据采样入门详解 - 给Python初学者的简单解释 声音是如何变成数字的&#xff1f;什么是采样率&#xff1f;为什么要懂这个&#xff1f;Python小例子总结 大家好&#xff01;今天我们来聊一个有趣的话题&#xff1a;音频数据是如何在计算机中处理的。让我用最简单的方式来解…

Python机器视觉的学习

一、二值化 1.1 二值化图 二值化图&#xff1a;就是将图像中的像素改成只有两种值&#xff0c;其操作的图像必须是灰度图。 1.2 阈值法 阈值法&#xff08;Thresholding&#xff09;是一种图像分割技术&#xff0c;旨在根据像素的灰度值或颜色值将图像分成不同的区域。该方法…

Cisco Packet Tarcer配置计网实验笔记

文章目录 概要整体架构流程网络设备互连基础拓扑图拓扑说明配置步骤 RIP/OSPF混合路由拓扑图拓扑说明配置步骤 BGP协议拓扑图拓扑说明配置步骤 ACL访问控制拓扑图拓扑说明配置步骤 HSRP冗余网关拓扑图拓扑说明配置步骤 小结 概要 一些环境配置笔记 整体架构流程 网络设备互连…

【优选算法】二分算法(在排序数组中查找元素的第一个和最后一个位置,寻找峰值,寻找排序数组中的最小值)

二分算法简介&#xff1a; 提到二分我们可能都会想起二分查找&#xff0c;二分查找要求待查找的数组是有序的&#xff0c;与我们今天讲的二分算法不同&#xff0c;并不是数组元素严格按照有序排列才可以使用二分算法&#xff0c;只要数组中有一个点可以将数组分为两个部分&…

下载与使用PCL启动器(2.8.12正式版)

一.下载PCL启动器 PCL启动器下载官网&#xff1a;爱发电 连接创作者与粉丝的会员制平台将创作的自由还给创作者&#xff01;爱发电是让创作者简单地获得稳定收入的粉丝赞助平台。无论你在创作什么&#xff0c;都能在这里获得持续的资金支持&#xff0c;让创作从此更自由。htt…

【系统思辨】分散注意

注意力在我们的日常生活和工作中扮演着至关重要的角色。注意力可以提高效率和准确性、减少错误和失误&#xff0c;提升学习效率&#xff0c;促进创造力。与此同时&#xff0c;各种各样的生活事件在分散我们的注意力&#xff0c;并且还有很多分散我们注意的手段&#xff0c;比如…

【ArcGIS】基于R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作

第一章、以问题导入的方式&#xff0c;深入掌握原理基础【理论篇】 1、R语言入门&#xff1a; &#xff08;1&#xff09;安装R及集成开发环境&#xff08;IDE&#xff09;&#xff1b;&#xff08;2&#xff09;R语言基础语法与数据结构&#xff0c;包括&#xff1a;程序包安…

泊松编辑 possion editing图像合成笔记

开源地址&#xff1a; GitHub - kono-dada/Reproduction-of-possion-image-editing 掩码必须是矩形框

江科大笔记—DMA数据转运DMA+AD多通道

1. DMA初始化结构体详解 标准库函数对每个外设都建立了一个初始化结构体xxx_InitTypeDef(xxx为外设名称)&#xff0c;结构体成员用于设置外设工作参数&#xff0c; 并由标准库函数xxx_Init()调用这些设定参数进入设置外设相应的寄存器&#xff0c;达到配置外设工作环境的目的。…

程序算术题-2

程序算术题-2 输出所有组合逻辑实例代码 输出所有排列逻辑实例代码 输出所有组合 计算一组数字按n位数组合的所有组合。 逻辑 /*** param stringBuilder 用于组合的拼接* param list 组合数序列* param level 目前位数* param exceptedLevel 组合期待位数*/…

第十四章:IO流 (java.io包中)

一、理解 1. 简单而言&#xff1a;流就是内存与存储设备之间传输数据的通道、管道。 2. 分类&#xff1a; (1) 按方向(以JVM虚拟机为参照物)【重点】 输入流&#xff1a;将<存储设备>中的内容读入到<内存>中。 输出流&#xff1a;将<内存>中的内容写入到…

MAC M3电脑在idea上搭建Spark环境并跑通第一个程序

我的电脑是Macbook Pro&#xff0c;最近在学习Spark&#xff0c;想要在idea里搭建Spark环境&#xff0c;为之后的Spark编程作准备。下面是在MAC版本的idea里配置Spark环境。 1. 准备工作 1.安装 JDK 确保Mac 上已经安装了 JDK 8 或更高版本。 可通过 java -version 查看是否…

Linux 安装NFS共享文件夹

程序默认使用2049端口&#xff0c;如果被占用需要修改端口104设置为服务端 122设置为客户端 一、在线安装&#xff08;服务端和客户端执行&#xff09; yum install nfs-utils rpcbind -y二、配置启动参数&#xff08;服务端执行&#xff09; 104服务器/mnt路径下创建shareda…

Maven常用插件清单

Maven 是一个强大的项目管理和构建工具&#xff0c;它使用插件来执行各种构建生命周期任务。以下是常用的一些 Maven 构建插件及其主要用途&#xff1a; 1. Maven Compiler Plugin 用途&#xff1a;编译Java源代码。配置示例&#xff1a;<build><plugins><plu…

大模型呼出机器人详解

大模型呼出机器人详解 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/lihaiya/freeipcc 大模型呼出机器人是基于大规模深度学习模型构建的智能化客服系统&#xff0c;它能够处理海量数据并学习其中的规律&#xff0c;从而实现高…

欧科云链研究院:AI时代,如何证明“我是我”?

OKG Research&#xff5c;编辑 近日&#xff0c;OpenAI 发布了新模型 Sora。这是一款高性能的文本到多模态生成工具&#xff0c;支持从文本生成精细的图像和动态视频。 相较早先发布的视频样例&#xff0c;该功能目前已经可以由用户真实上手体验&#xff0c;目前由于服务过载…

React 进阶深入理解核心概念与高阶实践

在上一节中&#xff0c;我们学习了 React 的基础知识&#xff0c;包括组件、状态管理和基本操作。接下来&#xff0c;我们将进一步探索 React 的高级功能和实战技巧&#xff0c;例如 组件间通信、高阶组件、Context API、React Router 等。这些内容将帮助你构建更复杂、功能更丰…

3.python运算符

Python 提供了多种运算符&#xff0c;用于执行算术、比较、逻辑等各种操作。以下是 Python 中常见的运算符类型及其用法&#xff1a; 文章目录 1. 算术运算符2. 比较运算符3. 逻辑运算符4. 赋值运算符5. 位运算符6. 成员运算符7. 身份运算符8. 运算符优先级 1. 算术运算符 算…

任务5 Web服务配置与管理

Web服务概述 Web服务简介 当今人们获取和传播信息的主要方式之一。 Web服务提供的资源多种多样&#xff0c;可能是简单的文本&#xff0c;也可能是图片、音频和视频等多媒体数据。 常用的浏览器有Chrome、Internet Explorer&#xff0c;以及Firefox等。 手机等移动设备成为…

Opencv之图像添加水印

一、实验原理 在图片处理领域&#xff0c;添加水印是一种常见的操作。通过叠加图像的方式&#xff0c;可以将水印无缝嵌入目标图像的指定位置。其基本原理包括以下步骤&#xff1a; 1、模板输入&#xff08;掩膜生成&#xff09;&#xff1a; 将水印图片转换为灰度图&#xf…