最长回文串

news2024/11/17 7:25:30

Manacher

问题

寻找字符串中的最长回文串

传统做法

  • 字符串首字符前加一个特殊字符 ‘#’ 末尾字符加一个特殊字符 ‘#’ 相邻字符间也加上特殊字符 ‘#’

  • 遍历字符串,除特殊字符外,以每个字符作为回文字符串的中心向外扩张

思考

很明显这种做法的时间复杂度是很高的,所以采用manacher进行提速

提速

数据

记录数据R表示目前最长回文串的的半径

记录数据M表示目前最长回文串的中心

数组parr存储每个字符为中心的最长回文串的半径

思路

根据遍历字符下标iR的关系分为以下情况

  1. iR范围外,则自己往外扩

  2. iR范围内,根据以M做对称点的i'情况分为三种情况

  • parr[i']R范围内,但不与R边缘位置重叠,则parr[i] = parr[i']

  • parr[i']超出R范围,则parr[i] = R - i

  • parr[i']R范围内,与R边缘位置重叠,也是自行扩,有一段距离不用判断: R - i

实现

string f1(string str)
{
    string res;
    
    for(int i = 0;i < str.size() * 2 + 1;i++)
    {
        res += i & 1 ? str[i / 2] : '#';
    }
    return res;
}
​
int f2(string str)
{
    if(str.size() == 0) return 0;
    int R = -1;
    int M = -1;
    string pstr = f1(str);
    int* parr = new int(pstr.size());
    int Rmax = INT32_MIN;
    for(int i = 0;i < pstr.size();i++)
    {
        /******不用判断的半径******/
        int parr[i] = R > i ? min(parr[2 * M - i],R - i) : 1;
        
        while(i + parr[i] < pstr.size() && i - parr[i] > -1)
        {
            if(str[i + parr[i]] == str[i - parr[i]])
            {
                parr[i]++;
            }
            else break;
        }
        
        if(parr[i] + i > R)
        {
            R = i + parr[i];
            M = i;
        }
        Rmax = max(Rmax,parr[i]);
    }
    delede[] parr;
    return Rmax - 1;
}

思考

parr[i'] 在R范围内

 R范围内已是回文串且以M为中心点,所以M做对称点的i'的半径结果,就是i的半径结果

parr[i'] 超出R范围内

i的半径结果为R - i,不可能为更大

R - i 为什么不可能更大

 如图,假设i开始还可以往外扩,则? = b ;以M为中心,? 的对称点也为b,那R的值应该更大才对,可是R之前并没有扩到那么大,所以假设不成立

parr[i'] 在R范围内,但与R重叠

 此情况下i是可以往外扩的,不会影响R值,可以用上面的方法印证

总结

不同情况下,扩与不扩分析,需要理解清楚

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

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

相关文章

吴恩达ChatGPT《LangChain for LLM Application Development》笔记

基于 LangChain 的 LLM 应用开发 1. 介绍 现在&#xff0c;使用 Prompt 可以快速开发一个应用程序&#xff0c;但是一个应用程序可能需要多次写Prompt&#xff0c;并对 LLM 的输出结果进行解析。因此&#xff0c;需要编写很多胶水代码。 Harrison Chase 创建的 LangChain 框…

基于Mybatis的数据权限拦截器实现

目录 一、背景二、动机三、实现思路3.1 权限类型、操作类型3.2 统一用户及数据权限集合模型3.3 定义数据权限拦截注解3.4 提取配置属性3.5 数据权限拦截器实现 四、集成方式五、关于D3S 一、背景 最近一直在做RBAC相关的架构设计与实现&#xff0c;传统的RBAC的权限控制只是控…

2023CCF CAT- 全国算法精英大赛

目录 A Flower B Tree C Best Travel Plans D Hearthstone E Hotpot F Mystery Sailing Challenge G Card H The diameter of a rectangle I Tourist J Mysterious Rune String A Flower B Tree C Best Travel Plans D Hearthstone E Hotpot F Mystery Sailing Challe…

Git标签管理

目录 标签介绍 创建标签 删除标签 推送标签到远程仓库 标签介绍 标签tag&#xff0c;可以理解为是对某次commit 的一个标识&#xff0c;相当于起了一个别名。 比如说有些重要的commit id 难以记住&#xff0c;这时候就可以利用tag给这个commit id 起一个有意义的名字&…

【QT】图形化页面设计

可视化的图形化界面共有三种设计方式&#xff0c;一种是通过可视化来设计界面的方式&#xff1b;一种是代码化的设计方式&#xff1b;最后是混合上面两种的混合界面设计方式。目前我们只考虑通过Designer和代码来设计图形化页面的两种方式。 目录 可视化图形界面设计 图形页…

数字信号的载波传输

从信号传输质量来看&#xff0c;数字系统优于模拟系统。 由于数字基带信号的频谱包含低频成分&#xff0c;而许多重要的通信信道是带通型的&#xff0c;比如无线信道和许多有线信道&#xff0c;这时需要调制成数字频带信号。 数字调制与模拟调制原理基本相似&#xff0c;有调幅…

ChatGLM-6B详细学习实践记录与资料分享

随着年初chatGPT产品的退出和迭代发展&#xff0c;凭借一己之力将大模型带火&#xff0c;国产很多厂商后续也陆续跟进开始投入研发属于自己的大模型产品&#xff0c;在这段时间里面陆陆续续出来了很多不同的产品&#xff0c;比如&#xff1a;文心一言、星火大模型、通义千问、商…

吴恩达AIGC《How Diffusion Models Work》笔记

1. Introduction Midjourney&#xff0c;Stable Diffusion&#xff0c;DALL-E等产品能够仅通过Prompt就能够生成图像。本课程将介绍这些应用背后算法的原理。 课程地址&#xff1a;https://learn.deeplearning.ai/diffusion-models/ 2. Intuition 本小节将介绍扩散模型的基础…

gof23设计模式之代理模型

1. 代理模式 1.1. 概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时&#xff0c;访问对象不适合或者不能直接引用目标对象&#xff0c;代理对象作为访问对象和目标对象之间的中介。 Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代…

Kubernetes对象深入学习之一:概览

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 关于《Kubernetes对象深入学习》系列 在client-go的学习和使用过程中&#xff0c;不可避免涉及到对象相关的代码&#xff0c;经常面临一个尴尬的现象&#x…

PCL点云处理之多角度剖面切割(一百九十五)

PCL点云处理之多角度切割点云剖面(一百九十五) 一、算法介绍二、具体实现1.沿法向量方向切割剖面2.沿竖直方向切割剖面3.沿水平方向切割剖面一、算法介绍 点云的剖面往往隐藏着很多有用信息,而且分析更加简单一些,这里自己实现一系列不同角度的点云剖面切割,包括沿着法向量…

车载软件架构 —— 闲聊几句AUTOSAR OS(七)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标…

Framework - AMS

一、概念 Android10&#xff08;API29&#xff09;开始&#xff0c;ActivityTaskManagerService 接管 ActivityManagerService。 二、启动ATMS过程 三、启动APP & 跳转Activity过程 3.1 Activity → ATMS 启动一个 APP 或跳转一个 Activity 都是调用的 startActivity()&a…

数据结构--串的存储结构

数据结构–串的存储结构 串的顺序存储 静态数组实现(定长顺序存储) #define MAXLEN 255 typedef struct {char ch[MAXLEN];int length; }SString;动态数组实现(堆分配存储) typedef struct {char* ch;int length; }HString;int main() {HString S;S.ch (char*)malloc(sizeo…

问题解决:centos7异常关闭后无法开机

前言&#xff1a;主机卡死&#xff0c;直接关了电脑电源&#xff0c;虚拟机中的centos7 产生错误&#xff0c;无法开机 重点是取消挂载。很多文章都提到了xfs_repair /dev/dm-0 , 但是不适用我遇到的情况。 # ls /dev/mapper umount /dev/mapper/centos-root xfs_repair -v -…

[洛谷]B3601 [图论与代数结构 201] 最短路问题_1(负权)(spfa)

SPFA模板啦~ 直接上ACcode: #include<bits/stdc.h> using namespace std; //#define int long long #define inf 2147483647 const int N15e310,M2*N; int dis[N],head[N],cnt; bool vis[N]; int n,m; struct E {int to,w,next; } e[M]; queue<int>q; void add(in…

U-Boot移植 - 1_嵌入式Linux系统移植概述

文章目录 1. 嵌入式Linux系统移植概述2. 实验开发板简介3. U-Boot简介4. NXP uboot测试 1. 嵌入式Linux系统移植概述 Linux 的移植主要包括3部分&#xff1a; 移植「bootloader 代码」&#xff0c; Linux 系统要启动就必须需要一个 bootloader 程序&#xff0c;也就说芯片上电…

【Android Framework (十) 】- ContentProvider

文章目录 知识回顾启动第一个流程initZygote的流程system_serverServiceManagerBinderLauncher的启动AMSservicebinderService 前言源码分析1.使用方法2.ContentProvider实现类。3.使用方法4.注册Observer正文 拓展知识 总结 知识回顾 启动第一个流程init 1&#xff0c;挂载文…

基于eBPF技术的云原生可观测实践

** 基于eBPF技术的云原生可观测实践 ** eBPF技术是Linux内核3.15版本中引入的全新设计&#xff0c;自从2014年发布以来&#xff0c;一直都备受瞩目。在过去几年中&#xff0c;基于eBPF技术的实践和工程落地层出不穷&#xff0c;出现了爆发式的增长。2015年微软、Google、Face…

浏览器里的任意一个请求通过postman生成对应的代码

大多数情况下&#xff0c;我们都是不知道某个网站的get或者post请求以及其他请求&#xff08;比如说PUT请求等&#xff09;是该加哪些headers和cookie才能用代码请求成功&#xff0c;这时就需要下面的操作了。 浏览器里的任意一个请求通过postman生成对应的代码&#xff1a; …