# leetcode#5最长回文数C++

2023-10-29

leetcode#5最长回文数C++

一.思路一:中心扩散

对每一个字符,检测它与它旁边的数是否为回文数,如果是,那么再扩展它 的长度检查,分奇偶情况讨论,得到以该字符为中心最长的回文数。在遍历过程中用max[2]储存该目前最长的回文数位置和长度。这样算法时间复杂度为O(n^2)。

1.1代码实现

1.1.1# 新工具

string s;
s.substr(int i,int j);
用于截取string,返回s[i]开始j个字符。
string+=s[i];
int max(int a,int b)
返回a,b中大的一个

1.1.2# 不甘放弃
class Solution {
public:
    string longestPalindrome(string s) {
        int len=s.size();
        if(len==0||len==1)
            return s;
        int start=0;//记录最大回文子串起始位置
        int end=0;//记录最大回文子串终止位置
        int mlen=0;//记录以s【i】为中心最大回文子串的长度
        for(int i=0;i<len;i++)
        {
            int len1=expendaroundcenter(s,i,i);//一个元素为中心
            int len2=expendaroundcenter(s,i,i+1);//两个元素为中心
            mlen=max(max(len1,len2),mlen);//记录以i为中心的最大回文数
            if(mlen>end-start+1)//记录最大的回文数
            {
                start=i-(mlen-1)/2;
                end=i+mlen/2;
            }
            /*if(i>len/2&&mlen/2>len-i)
            break;(精简步骤edition2)*/ 
        }
        return s.substr(start,mlen);
        //该函数的意思是获取从start开始长度为mlen长度的字符串
    }
private:
    int expendaroundcenter(string &s,int left,int right)
    //!!!!这里&s,大幅提升效率!!!!!
    //计算以left和right为中心的回文串长度
    {
        int L=left;
        int R=right;
        while(L>=0 && R<s.length() && s[R]==s[L])//防止越界我
        {
            L--;
            R++;
        }
        return R-L-1;
    }
};
```/*
改编自chenlele
链接:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zui-chang-hui-wen-zi-chuan-c-by-gpe3dbjds1/
来源:力扣(LeetCode)*/

执行用时:16 ms, 在所有 C++ 提交中击败了94.83%的用户
内存消耗:6.9 MB, 在所有 C++ 提交中击败了99.68%的用户

思考

可以根据已有最长回文串长度mlen与i的位置,进一步缩小程序。
edition 2
在这里插入图片描述
可以看见用时缩短了一倍,但内存增加了0.1mb

1.2简化:Manacher

给字符串插#

字符+### 总长
偶数+奇数 奇数
“abcd” “#a#b#c#d#”
奇数+偶数 奇数
“abc” “#a#b#c#”
1.2.1实现方法

用一个辅助string存储新字符串,得到辅助最长回文串以[i]为中心,扩散了mlen步,长2*mlen+1。
映射到原字符串以i/2为中心扩散了mlen/2步。
那么这个字符串覆盖了2 *(mlen/2)个间隔

0 1 2 3
a b c d
辅助 0 1 2 3 4 5 6 7

输出:
start = (i - mlen) / 2;
return s.substr(start, mlen);

1.2.2代码实现

   int centerSpread(string &s, int center) {
       int len = s.size();
       int i = center - 1;
       int j = center + 1;
       int step = 0;
       while (i >= 0 && j < len && s[i] == s[j]) {
           i--;
           j++;
           step++;
       }
       return step;
   }

public:


   string longestPalindrome(string &s) {
       int size = s.size();
       if (size < 2) {
           return s;
       }

       string str = "#";
       for (int i = 0; i < s.size(); ++i) {
           str += s[i];
           str += "#";
       }
       int sSize = 2 * size + 1;
       int maxLen = 1;

       int start = 0;
       for (int i = 0; i < sSize; i++) {
           int curLen = centerSpread(str, i);
           if (curLen > maxLen) {
               maxLen = curLen;
               start = (i - maxLen) / 2;
           }
       }
       return s.substr(start, maxLen);
   }
};

作者:liweiwei1419
链接:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zhong-xin-kuo-san-dong-tai-gui-hua-by-liweiwei1419/
来源:力扣(LeetCode)

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

# leetcode#5最长回文数C++ 的相关文章

  • 利用 AES 对 log4j 日志文件加密

    总览 本文简要介绍了 AES 算法加密的方式 以及如何利用 AES 对 log4j 输出的日志进行加密 背景 在互联网时代下 JAVA 大多用来做后端开发 由于后端的程序大多都部署在自己的服务器上 客户接触不到程序的日志文件 因此 多数情况
  • nacos无法正常下线问题记录

    问题描述 公司搭建了nacos集群 但是在微服务下线时会无法正常下线 点击下线提示 caused errCode 500 errMsg do metadata operation failed caused com alibaba naco
  • 基于vue2和element-ui的项目框架模板加强版

    前言 我的上篇博客讲了如何基于vue2和element ui搭建一个基础的项目框架模板 有兴趣的可以看下 文章有点长 这篇博客就谈谈可以在基础框架模板上增添哪些功能 ie兼容 ie兼容之前是让我很头痛的一件事 但经过我的反复摸索 百度 哈哈

随机推荐

  • Unity新手基础知识系列—序

    前提提要 本系列主要内容是根据 Unity中文文档来总结的 其实本人也是现在正在学习Unity相关基础 可能有一些理解不到位或者理解错误的地方 望大家指正 为什么写这个系列 1 为了记录自己学习的内容 方便以后自己再查阅 2 巩固知识体系
  • 力扣:只出现一次的数字

    给定一个非空整数数组 除了某个元素只出现一次以外 其余每个元素均出现两次 找出那个只出现了一次的元素 class Solution public int singleNumber int nums int result 0 for int
  • c语言字符串替换函数StrReplace(char strRes[],char from[], char to[])可直接使用

    将如下函数添加到文件中 可直接调用 StrReplace char strRes char from char to strRes 原始字符串 rom 需要替换的字符 串只替换第一次出现的位置 to 需要替换成什么字符串 成功返回 1 失败
  • 【牛客·剑指offer】Python JZ4二维数组查找、JZ3 数组中的重复数字、JZ5 替换空格、JZ6 从尾到头打印链表

    一 JZ4二维数组查找 描述 在一个二维数组array中 每个一维数组的长度相同 每一行都按照从左到右递增的顺序排序 每一列都按照从上到下递增的顺序排序 请完成一个函数 输入这样的一个二维数组和一个整数 判断数组中是否含有该整数 1 2 8
  • 【Unity】模仿GUILayout.SelectionGird绘制一组互斥的按钮

  • STM32的中断介绍

    目录 一 STM32中断应用概览 1 简介 2 中断编程的顺序 1 使能中断请求 2 中断优先级分组 3 配置NVIC寄存器 初始化NVIC InitTypeDef 4 编写中断服务函数 二 EXTI 外部中断 事件控制器 1 简介 2 E
  • 解决dubbo问题:com.alibaba.dubbo.rpc.RpcException: Forbid consumer (很可能是一个访问都没有注册成功)

    线下环境经常出现类似这种异常 com alibaba dubbo rpc RpcException Forbid consumer access service from registry use dubbo version 2 5 3 P
  • CVPR2020超分辨率重建论文阅读笔记

    为什么要进行超分辨率重建 1 视觉效果不吸引人 2 影响下游方法使用 如分割等 3 电子显示产品分辨率提高 需要更高分辨率的图像 超分辨率重建问题面临难点和存在问题如下 1 病态问题 一对多 同样的LR图像对应无数解 2 MSE指标可能导致
  • STM32 基础系列教程 38 - Lwip_http

    前言 HTTP协议 HyperText Transfer Protocol 超文本传输协议 是因特网上应用最为广泛的种网络传输协议 所有的WWW文件都必须遵守这个标准 HTTP是一个基于TCP IP通信协议来传递数据 HTML 文件 图片文
  • CNN经典网络模型(四):GoogLeNet简介及代码实现(PyTorch超详细注释版)

    目录 一 开发背景 二 网络结构 三 模型特点 四 代码实现 1 model py 2 train py 3 predict py 4 spilit data py 五 参考内容 一 开发背景 GoogLeNet在2014年由Google团
  • @Validated 注解不起作用 怎么办?@Validated 无效 解决办法

    有一种可能是之前没有查到的 那就是pom缺少依赖 在项目的pom xml 文件中添加以上依赖 可有效解决问题
  • MySQL触发器trigger的使用

    Q 什么是触发器 A 触发器是与表有关的数据库对象 在满足定义条件时触发 并执行触发器中定义的语句集合 触发器的特性 1 有begin end体 begin end 之间的语句可以写的简单或者复杂 2 什么条件会触发 I D U 3 什么时
  • 线程的六种状态

    1 New 新建状态 线程刚被创建 start方法之前的状态 2 Runnable 运行状态 得到时间片运行中状态 Ready就绪 未得到时间片就绪状态 3 Blocked 阻塞状态 如果遇到锁 线程就会变为阻塞状态等待另一个线程释放锁 4
  • repo 使用

    repo 使用 repo start 创建并切换分支 repo start newbranchname all projectName repo start是对git checkout b 命令的封装 git checkout b 是在当前
  • 无监督特征选择算法综述

    无监督特征选择算法 Filter方法 只使用数据的内在属性 不使用聚类等其他辅助方法 速度快 单变量 Information based methods SUD Sequential backward selection method fo
  • 毕业设计-基于机器视觉的手写字体智能识别系统

    目录 前言 课题背景和意义 实现技术思路 一 系统整体结构框架设计 二 系统硬件设计 三 系统软件框架设计 四 实验与分析 五 总结 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准
  • 分布式系统下的纠删码(二) -- Locally Repairable Codes (LRC)

    分布式系统下的纠删码 二 Locally Repairable Codes LRC 一 名词解释 MDS Maximun Distance Separable MDS 性质 是纠删码的一个重要性质 它保证n k m个磁盘中任意k个磁盘都可恢
  • OpenLayers官网教程-移动端地图和传感器

    这一系列翻译自openlayers官网的WorkShop OL官网提供了多个系列教程供开发者学习参考 其中QuickStart是面向初学者的hello world Tutorials提供了构建OL应用的一些基础知识 WorkShop 本系列
  • scss 样式穿透

    当一些组件 例如 轮播 全局引入时 只改当前页面的样式 用css类选择器不能直接选择更改 应用scss样式穿透 注 scoped让css只在当前组件生效 不考虑兼容问题 去掉scoped也可以直接更改css样式
  • # leetcode#5最长回文数C++

    leetcode 5最长回文数C 一 思路一 中心扩散 对每一个字符 检测它与它旁边的数是否为回文数 如果是 那么再扩展它 的长度检查 分奇偶情况讨论 得到以该字符为中心最长的回文数 在遍历过程中用max 2 储存该目前最长的回文数位置和长