最长回文子串问题

原题链接

5. 最长回文子串 - 力扣(LeetCode)

题目解析

        给一个字符串s,求出它最长的回文子串之一。

回文串:逆序后与原字符串一样的字符串,如abcba

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

三种解法

动态规划

原理:记录任意两个点对应的子串是否能构成回文串。

判断条件:令 i > j ,对于s[i]到s[j]是否是回文串来说。在s[i]=s[j]的情况下:1.i和j紧密相连,2.i和j中间只有一个值,3.s[i-1]到s[j+1]是一个回文串满足这三个条件之一即可。


class Solution {
public:string longestPalindrome(string s) {int begin = 0, end = 0,n = s.size();vector<vector<bool>>dp(1000,vector<bool>(1000,false));for(int i = 1;i<n;i++){for(int j = i-1 ; j >= 0 ;--j){if((s[i]==s[j])&&((i-j<3)||(dp[i - 1][j + 1] == true))){dp[i][j] = true;if(i - j>end-begin){end = i;begin = j;}}}}return s.substr(begin,end-begin+1);}
};

时间复杂度o(n^2),空间复杂度o(n^2)

中心扩展

从左向右遍历s,对于每个下标来说,如果周围连续的n个字符构成的字符串是回文字符串的话便记录下来

class Solution {
public:string longestPalindrome(string s) {int n=s.size(),left=0,right = 0;int begin = 0,end =0;for(int i = 1;i<n;i++){left = i-1,right=i+1;while(left>=0&&right<n&&s[right]==s[left]){left--,right++;}if(end-begin<right-left-2){end = right-1;begin =left+1;}left = i-1,right=i;while(left>=0 && right<n&&s[right]==s[left]){left--,right++;}if(end-begin < right-left-2){end = right-1;begin =left+1;}}return s.substr(begin,end-begin+1);}
};

时间复杂度o(n^2),空间复杂度o(1)

Manacher

上图来自leetcode的官方题解,我水平一般,就不去细讲了,简单说一下思路:

打个比方对于字符串abbbbbc来说,把中心拓展法求出来的数列成数组。

abbbbbc->1235311

对于倒数第三个b来说,左右的元素是对称的,所以不需要判断即可得出,第二个b和第四个b对应的值是一样的,这样的话就可以跳过第四个行这样不断地跳过那些可以被推导出来的值即可将时间复杂度降到o(n)

class Solution {
public:void init(string& s) {string tmp ="#";for (auto& e : s) {tmp.push_back(e);tmp.push_back('#');}tmp.push_back('#');swap(s, tmp);}int expand(string& s,int left,int right) {while(left>=0&&right<s.size()&&s[left]==s[right])left--,right++;return (right-left-2)/2;}string longestPalindrome(string s) {init(s);int center = 0, len = 0, right = -1, n = s.size();int begin = 0,end = -1;vector<int> arm_len;for (int i = 0; i < n; i++) {len = 0;if (i > right) {len = expand(s,i,i);}else{int left = 2*center-i;int min_arm_len = min(arm_len[left],right-i);len = expand(s,i-min_arm_len,i+min_arm_len);}arm_len.push_back(len);if(i+len>right){center = i;right = i + len;}if(len*2+1>end -begin){begin = i-len;end = i + len;}}string ans;for (int i = begin; i <= end; ++i) {if (s[i] != '#') {ans += s[i];}}return ans;}
};

时间复杂度o(n),空间复杂度o(n)


感谢观看!!!

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

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

相关文章

Web3解密:理解去中心化应用的核心原理

引言 在当前数字化时代&#xff0c;去中心化技术和应用正在逐渐引起人们的关注和兴趣。Web3技术作为去中心化应用&#xff08;DApps&#xff09;的基础&#xff0c;为我们提供了一个全新的互联网体验。但是&#xff0c;对于许多人来说&#xff0c;这个复杂的概念仍然充满了神秘…

【MATLAB】GUI初步设计

MATLAB界面设计 前言一、基本步骤1.1 创建GUI文件1.2 界面设计 总结 前言 为了完成图像处理的作业&#xff0c;简直就是生活不易啊 找到一个很棒的教学视频 基于MATLAB的GUI界面设计流程讲解 一、基本步骤 1.1 创建GUI文件 由于在写博文之前我已经创建好文件了&#xff0c;…

【Linux】:文件查看 stat、cat、more、less、head、tail、uniq、wc

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Linux深造日志 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、stat&#xff08;查看文件详细属性信息&#xff09;1.1 内容解析&#xff1a;1.2…

上门服务系统|上门服务小程序搭建流程

随着科技的不断进步和人们生活水平的提高&#xff0c;越来越多的服务开始向线上转型。传统的上门服务业也不例外&#xff0c;随着上门服务小程序的兴起&#xff0c;人们的生活变得更加便捷和高效。本文将为大家介绍上门服务小程序的搭建流程以及应用范围。 一、上门服务小程序搭…

合合信息引领AI场景化革新,供应链金融智能化审核全面升级!

官.网地址&#xff1a;合合TextIn - 合合信息旗下OCR云服务产品 随着供给侧结构性改革的深入推进和产业结构的不断升级&#xff0c;金融机构在监管部门的指导下&#xff0c;积极拓展供应链金融业务&#xff0c;取得了显著成效。这一举措有效缓解了上下游中小企业的融资困难&a…

智能变频三模正弦波控制器

智能变频三模正弦波控制器 前言一、图片介绍总结 前言 不敢动&#xff0c;完全不敢动。多做笔记&#xff0c;完全了解之后再说吧 一、图片介绍 轮毂电机 主角登场 淘宝关于这款控制器的介绍 当然不同的型号功能不同 学习线插上就会转,可以使用继电器控制通断。 电门…

水星路由器X30G问题:中继丢失dhcp(最后发现是移动入户光猫路由器问题)

先上结论&#xff1a;不是水星路由器的问题&#xff0c;而是移动接入光猫路由器的问题。 修改了网络拓扑&#xff0c;将路由器X30G设为ap有线中继&#xff0c;正常使用中&#xff0c;一天突然发现&#xff0c;所有的wifi上来的&#xff0c;都把路由设为该路由器的局域网端口19…

Flutter - 折叠面板

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新&#xff0c;请前往github查看最新代码 flutter 自定义折叠组件 支持三种类型和两种展示效果可自定义title和被折叠的内容 效果图 示例 import package:flutter/material.dart; import /jh_common/widge…

3d合并的模型为什么没有模型---模大狮模型网

在3D建模中&#xff0c;合并模型是常见的操作&#xff0c;它可以将多个模型合并成一个整体。然而&#xff0c;有时候在合并后却发现部分模型消失了&#xff0c;这可能会让人感到困惑和失望。本文将探讨为什么合并的3D模型中会出现没有模型的情况&#xff0c;并提供一些解决方法…

【数据结构7-2】-二叉排序树(建立、遍历、查找、增加、删除)

目录 1 基础说明2 基本思路-二叉树的创建和插入2.1 节点存储结构的建立2.2 二叉树创建函数的设计2.3 二叉树插入函数的设计2.4 简单的进行二叉树的检测看看插入的对不对&#xff1a;2.5 整体代码&#xff1a; 3 二叉树的遍历3.1 中序遍历3.2 程序代码&#xff1a;3.3 程序结果&…

网络安全之文件上传漏洞(上篇)(技术进阶)

目录 一&#xff0c;什么是文件上传漏洞&#xff1f;文件上传漏洞会造成什么危害&#xff1f; 二&#xff0c;文件上传靶场upload-labs闯关 Pass-01 Pass-02 Pass-03 Pass-04 Pass-05 Pass-06 Pass-07 ​Pass-08 Pass-09 Pass-10 总结 一&#xff0c;什么是文件上传漏洞&…

基于Ubuntu-base构建根文件系统

Ubuntu是一个非常常见的发行版系统&#xff0c;具有丰富的软件功能&#xff0c;可以方便的进行各类开发&#xff0c;系统的apt工具更是搭建各种开发环境的神器。当我们在基于X86的电脑Ubuntu完成功能开发后&#xff0c;想要将功能移植到arm板上&#xff0c;使用Ubuntu可以大大节…