最长回文子串 Golang leecode_5

先暴力

package mainimport ("fmt"
)func longestPalindrome(s string) string {bytes := []byte(s)var count intvar res string = string(bytes[0])for i := 0; i < len(s); i++ {var temp string = string(bytes[i])for j := i + 1; j < len(s); j++ {temp = temp + string(bytes[j])if JudgePalindrome(temp) && count < len(temp) {res = tempcount = len(temp)}}}return res
}func JudgePalindrome(s string) bool {bytes := []byte(s)var res []bytefor i := len(s) - 1; i > -1; i-- {res = append(res, bytes[i])}str := string(res)if str == s {return true} else if str != s {return false}return false
}func main() {/*给你一个字符串 s,找到 s 中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。*/s := "ccc"fmt.Println(longestPalindrome(s))
}

发现虽然给的一些例子答案都对,但是提交的时候超时了,时间复杂度达到了O(n^3),看看能不能优化。
我尝试着优化一下判断回文的函数,不用整个颠倒后来,只颠倒一半,如下:

func JudgePalindrome(s string) bool {length := len(s)if length%2 == 0 {slice1 := s[:length/2]slice2 := s[length/2:]var slice3 []bytefor i := len(slice2) - 1; i > -1; i-- {slice3 = append(slice3, slice2[i])}if string(slice1) == string(slice3) {return true} else {return false}} else if length%2 == 1 {slice1 := s[:length/2]slice2 := s[length/2+1:]var slice3 []bytefor i := len(slice2) - 1; i > -1; i-- {slice3 = append(slice3, slice2[i])}if string(slice1) == string(slice3) {return true} else {return false}}return false
}

还是超时,因为没有从数量级上降低时间复杂度,依然是O(n^3),看来得从根本上优化。
看了一下 leecode 给的官方题解,采用了中心扩展算法将时间复杂度降到了 O(n^2),主要的思想就是如果中心的子串是回文串,那么就尝试着向两边扩散,算法用 debug 跑一遍很好懂,代码如下:

func longestPalindrome(s string) string {if s == "" {return s}start, end := 0, 0for i := 0; i < len(s); i++ {left1, right1 := ExpandPalindrome(s, i, i)left2, right2 := ExpandPalindrome(s, i, i+1)if right1-left1 > end-start {start, end = left1, right1}if right2-left2 > end-start {start, end = left2, right2}}return s[start : end+1]
}func ExpandPalindrome(s string, left, right int) (int, int) {for ; left >= 0 && right < len(s) && s[left] == s[right]; left, right = left-1, right+1 {}return left + 1, right - 1
}

接下来是动态规划的代码题解,同样也是将时间复杂度降到了O(n^2)。官方题解有视频讲解

func longestPalindrome(s string) string {n := len(s)dp := make([][]bool, n)for i,_ := range dp {dp[i] = make([]bool, n)}ans := ""for l:=0; l<n; l++ { // l为本次循环遍历的子串长度for i:=0; i+l<n; i++ {j := i+lif l == 0 {dp[i][j] = true} else if l == 1 {dp[i][j] = (s[i] == s[j])} else {dp[i][j] = (s[i] == s[j] && dp[i+1][j-1])}if dp[i][j] && l+1 > len(ans) {ans = s[i:j+1]}}}return ans
}作者:Bonheur
链接:https://leetcode.cn/problems/longest-palindromic-substring/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

相关文章

相对定位、绝对定位、固定定位、绝对定位堆叠顺序

相对定位&#xff1a;相对自己本身进行偏移 CSS语法&#xff1a; position: relative;/*相对自己进行定位*/ top: 10px;/*距离上边*/ left: 10px;/*距离左边*/ 演示图&#xff1a; 绝对定位&#xff1a;默认以浏览器进行定位。如果想依照父盒子定位&#xff0c;需要在父盒子…

STM32 寄存器配置笔记——USART配置 打印

一、概述 本文主要介绍如何配置USART&#xff0c;并通过USART打印验证结果。以stm32f10为例&#xff0c;将PA9、PA10复用为USART功能&#xff0c;使用HSE PLL输出72MHZ时钟 APB2 clk不分频提供配置9600波特率。波特率计算公式如下&#xff1a; fck即为APB2 clk参考计算&#xf…

Linux 挂载磁盘之后需要修改 /etc/fstab

/etc/fstab是用来存放文件系统的静态信息的文件。位于/etc/目录下&#xff0c;可以用命令less /etc/fstab 来查看&#xff0c;如果要修改的话&#xff0c;则用命令 vi /etc/fstab 来修改。 当系统启动的时候&#xff0c;系统会自动地从这个文件读取信息&#xff0c;并且会自动…

ppt录屏制作微课,轻松打造精品课程

微课作为一种新型的教学方式逐渐受到广大师生的欢迎。微课具有方便快捷、内容丰富、互动性强等特点&#xff0c;可以有效地帮助教师传达知识&#xff0c;提高学生的学习效果。其中&#xff0c;ppt录屏制作微课就是一种常见的方式。本文将介绍ppt录屏的使用方法&#xff0c;帮助…

七天.NET 8操作SQLite入门到实战 - 第二天 在 Windows 上配置 SQLite环境

前言 SQLite的一个重要的特性是零配置的、无需服务器&#xff0c;这意味着不需要复杂的安装或管理。它跟微软的Access差不多&#xff0c;只是一个.db格式的文件。但是与Access不同的是&#xff0c;它不需要安装任何软件&#xff0c;非常轻巧。 七天.NET 8操作SQLite入门到实战…

opencv dots_image_kernel

1,opencv dots_image_kernel // halcon dots_image kernel估算&#xff08;d5) cv::Mat getDotKernel(int d 5){// 保证d为正的奇数d | 0x01;cv::Mat kernel cv::Mat::zeros(d 2, d 2, CV_8UC1);int cx kernel.cols / 2;int cy kernel.rows / 2;int cnt255 0, cnt128 …

R语言读文件“-“变成“.“

R语言读取文件时发生"-"变成"." 如果使用read.table函数&#xff0c;需要 check.namesFALSE data <- read.table("data.tsv", headerTRUE, row.names1, check.namesFALSE)怎样将"."还原为"-" 方法一&#xff1a;gsub函…

解决解析PDF编码报错(以pdfminer为例):UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte xxx

解决方法 博主使用的是pdfminer解析PDF文档&#xff0c;这个解决方法是通用的&#xff0c;只需要使PDFParser传入的文件为二进制文件即可&#xff0c;示例程序&#xff1a; from pdfminer.pdfparser import PDFParserpdf_parser PDFParser(open("pdf文件.pdf", &q…

第十二章 pytorch中使用tensorboard进行可视化(工具)

PyTorch 从 1.2.0 版本开始&#xff0c;正式自带内置的 Tensorboard 支持了&#xff0c;我们可以不再依赖第三方工具来进行可视化。 tensorboard官方教程地址&#xff1a;https://github.com/tensorflow/tensorboard/blob/master/README.md 1、tensorboard 下载 step 1 此次…

主流开源大语言模型的微调方法

文章目录 模型ChatGLM2网址原生支持微调方式 ChatGLM3网址原生支持微调方式 Baichuan 2网址原生支持微调方式 Qwen网址原生支持微调方式 框架FireflyEfficient-Tuning-LLMsSuperAdapters 模型 ChatGLM2 网址 https://github.com/thudm/chatglm2-6b 原生支持微调方式 https…

综述----知识蒸馏

4.1 模型改进 未来的研究可以集中在改进无图学习模型的性能和泛化能力。例如&#xff0c;可以研究更有效的知识表示和传递方法&#xff0c;以提高学生模型对教师模型知识的理解和利用能力。此外&#xff0c;可以探索新的模型结构和训练算法&#xff0c;以提高模型的效率和稳定…

torch 的数据加载 Datasets DataLoaders

点赞收藏关注&#xff01; 如需要转载&#xff0c;请注明出处&#xff01; torch的模型加载有两种方式&#xff1a; Datasets & DataLoaders torch本身可以提供两数据加载函数&#xff1a; torch.utils.data.DataLoader&#xff08;&#xff09;和torch.utils.data.Datase…

解锁电力安全密码:迅软DSE助您保护机密无忧

电力行业信息化水平不断提高&#xff0c;明显提升了电力企业的生产运营能力&#xff0c;然而随着越来越多重要信息存储在终端计算机中&#xff0c;电力面临的信息安全挑战也越来越多。 作为关键基础设施的基础&#xff0c;电力企业各部门产生的资料文档涵盖着大量机密信息&…

1.Qt5.15及其以上的下载

Qt5.15及其以上的下载 简介&#xff1a; ​ Qt是一个跨平台的C库&#xff0c;允许开发人员创建在不同操作系统&#xff08;如Windows、macOS、Linux/Unix&#xff09;和设备上具有本地外观和感觉的应用程序。Qt提供了一套工具和库&#xff0c;用于构建图形用户界面&#xff0…

【Linux】 find命令使用

find find命令是一种通过条件匹配在指定目录下查找对应文件或者目录的工具。匹配的条件可以是文件名称、类型、大小、权限属性、时间戳等。find命令还可以配合相关命令对匹配到的文件作出后续处理。 语法 find [路径...] [表达式] [path...]为需要查找文件所指定的路径。如果…

智能座舱架构与芯片- (12) 软件篇 中

三、智能座舱操作系统 3.1 概述 车载智能计算平台自下而上可大致划分为硬件平台、系统软件&#xff08;硬件抽象层OS内核中间件&#xff09;、功能软件&#xff08;库组件中间件&#xff09;和应用算法软件等四个部分。狭义上的OS特指可直接搭载在硬件上的OS内核&#xff1b;…

【C++进阶之路】第十一篇:C++的IO流

文章目录 1. C语言的输入与输出2. 流是什么3. CIO流3.1 C标准IO流3.2 C文件IO流 4.stringstream的简单介绍 1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放在变量中。prin…

7-sqlalchemy快速使用和原生操作、对象映射类型和增删查改、增加和基于对象的跨表查询、scoped线程安全、g对象、基本增查改和高级查询

1 sqlalchemy快速使用 2 sqlalchemy原生操作 3 sqlalchemy操作表 3.1 对象映射类型 3.2 基本增删查改 4 一对多关系 4.1 关系建立 4.2 增加和基于对象的跨表查询 4.3 一对一关系&#xff0c;就是一对多&#xff0c;只不过多的一方只有一条 5 多对多关系 5.2 增加和基于对象跨…

【人工智能Ⅰ】8-回归 降维

【人工智能Ⅰ】8-回归 & 降维 8-1 模型评价指标 分类任务 准确率、精确率与召回率、F值、ROC-AUC、混淆矩阵、TPR与FPR 回归任务 MSE、MAE、RMSE 无监督任务&#xff08;聚类&#xff09; 兰德指数、互信息、轮廓系数 回归任务的评价指标 1&#xff1a;MSE均方误差…

易航网址引导系统 v1.9 源码:去除弹窗功能的易航网址引导页管理系统

易航自主开发了一款极其优雅的易航网址引导页管理系统&#xff0c;后台采用全新的光年 v5 模板开发。该系统完全开源&#xff0c;摒弃了后门风险&#xff0c;可以管理无数个引导页主题。数据管理采用易航原创的JsonDb数据包&#xff0c;无需复杂的安装解压过程即可使用。目前系…