剑指 Offer II 020. 回文子字符串的个数 马拉车算法

news2024/11/15 20:56:30

这里写自定义目录标题

  • 马拉车算法
  • 剑指 Offer II 020. 回文子字符串的个数

马拉车算法

马拉车算法可以以接近线性时间判断计算回文串长度,遍历每一个中心点,再向两遍扩充

  1. 填充字符
    其中$ ! 作为边界,添加#可以避开对偶数回文串的讨论,所有回文串都是奇数回文串
原字符串填充后字符串
abba$#a#b#b#a#!
aba$#a#b#a#!

在这里插入图片描述
当考虑以 i i i为中心点的字符串时, f [ i ] f[i] f[i]为以 i i i为中心点的回文串的半径, R m a x Rmax Rmax为当前回文串的最大右端点, N o d e Node Node为相应中心点, i i i j j j是以 N o d e Node Node为中心点的回文串中对应部分

  1. 初始化
    利用回文串的特性进行初始化, i i i j j j(也就是图中蓝色方块)是相等的,所以可以直接用 f [ j ] f[j] f[j]初始化 f [ i ] f[i] f[i]
    j = 2 ∗ n o d e − i j=2*node-i j=2nodei
    初始化(要考虑边界情况)
    f [ i ] = ( i < R m a x ) ? m i n ( f [ j ] , R m a x − i + 1 ) : 1 f[i]=(i<Rmax)?min(f[j],Rmax-i+1):1 f[i]=(i<Rmax)?min(f[j],Rmaxi+1):1

  2. 向外扩展
    继续向两边判断是否还有相等的字符

  3. 维护Rmax和Node

  4. 一些细节:
    回文串的半径为 f [ i ] − 1 f[i]-1 f[i]1 因为在匹配中一定是停止于#符号 例如#a#b#b#a# 所以半径减1,或者说 f [ i ] f[i] f[i]的半径中包括了中心点和最后的#号,在上面的例子中半径为 #b#a#
    求回文串个数时要除以2,因为有#号

剑指 Offer II 020. 回文子字符串的个数

class Solution {
public:
    int countSubstrings(string s) {
        string t="$#";
        int f[2005],rmax=1,node=1,ans=0;
        int i;
        int n=s.length();
        for(i=0;i<n;i++){
            t+=s[i];
            t+='#';
        }
        t+='!';
        int m=t.length();
        // cout<<t<<endl;
        for(i=1;i<m-1;i++){
            f[i]=(i<=rmax)?min(f[2*node-i],rmax-i+1):1;
            while(t[i-f[i]]==t[i+f[i]])f[i]++;
            if(rmax<i+f[i]-1){
                rmax=i+f[i]-1;
                node=i;
            }
            ans+=f[i]/2;
        }
        return ans;


    }
};

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

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

相关文章

博客系统--测试用例编写

目录一&#xff0c;整体概览1.1&#xff0c;登录页面测试用例1.2&#xff0c;注册页面测试用例1.3&#xff0c;发布博客功能测试1.4&#xff0c;删除博客功能测试二&#xff0c;具体设计2.1&#xff0c;注册页面测试--等价类法2.2&#xff0c;删除博客功能测试--判定表法一&…

【csdn首发】全网爆火的从零到一落地接口自动化测试

前段时间写了一系列自动化测试相关的文章&#xff0c;当然更多的是方法和解决问题的思路角度去阐述我的一些观点。结合我自己实践自动化测试的一些经验以及个人理解&#xff0c;这篇文章来聊聊新手如何从零到一落地实践接口自动化测试。 为什么要做接口测试 测试理念的演变 早…

热启动预示生态起航的Smart Finance,与深度赋能的SMART通证

2023年初加密市场的回暖&#xff0c;意味着各个赛道都将在新的一年里走向新的叙事。最近&#xff0c;我们看到GameFi赛道也在市场回暖的背景下&#xff0c;逐渐走出阴霾。从融资数据上看&#xff0c;1月获得融资的GameFi项目共12个&#xff0c;融资突破8000万美元&#xff0c;1…

肝一波,这个网站居然可以免费使用ChatGpt功能

一、肝一波&#xff0c;体验真爽 废话不多少&#xff0c;小码哥直接提大家感兴趣的问题&#xff0c;截图分享给大家。 问题一&#xff1a;如何在一年内赚到100万元 答&#xff1a; 一、赚钱的方式 开公司&#xff1a;在一年内开拓新业务模式&#xff0c;寻求投资&#xff…

2023软件测试工程师涨薪攻略,3年如何达到月薪30K?

1.软件测试如何实现涨薪 首先涨薪并不是从8000涨到9000这种涨薪&#xff0c;而是从8000涨到15K加到25K的涨薪。基本上三年之内就可以实现。 如果我们只是普通的有应届毕业生或者是普通本科那我们就只能从小公司开始慢慢往上走。 有些同学想去做测试&#xff0c;是希望能够日…

33、基于51单片机老人防跌倒蜂鸣器报警系统加速度检测

背景技术 老年人出门由于身体不灵活、视力较差&#xff0c;容易发生跌倒&#xff0c;现用的老年人跌倒报警装置是通过无线对讲系统研发的&#xff0c;它外观精美&#xff0c;自动化程度高&#xff0c;有很强的专业性&#xff0c;但是&#xff0c;设计者忽略了一个问题&#xf…

【项目精选】JAVAWEB校园二手平台项目

点击下载源码 JAVAWEB校园二手平台项目&#xff0c;基本功能包括&#xff1a;个人信息、商品管理&#xff1b;交易商品板块管理等。本系统结构如下&#xff1a; &#xff08;1&#xff09;本月推荐交易板块&#xff1a; 电脑及配件&#xff1a;实现对该类商品的查询、用户留言…

如何选择O2OA(翱途)开发平台的部署架构?

O2OA(翱途)开发平台[下称O2OA开发平台或者O2OA]支持公有云&#xff0c;私有云和混合云部署&#xff0c;也支持复杂的网络结构下的分布式部署。本篇主要介绍O2OA(翱途)开发平台支持的部署环境以及常用的集群部署架构。软硬件环境说明支持的云化平台&#xff1a;华为云(包括鲲鹏)…

前后端开发过程中的跨域问题总结

1.何为跨域问题 出于浏览器的同源策略限制。同源策略是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能&#xff0c;如果缺少了同源策略&#xff0c;则浏览器的正常功能不能使用。可以说web是构建在同源策略基础之上的&#xff0c;浏览器只是针对同源策略的一种实现。…

面试23K字节测试开发岗被血虐,到底具有怎样的技术才算高级水平?

前几天我朋友跟我吐苦水&#xff0c;这波面试又把他打击到了&#xff0c;做了6年软件测试。。。 下面这条招聘是在腾讯招聘官网截图下来的&#xff0c;首先我们对高级水平下一个定义吧&#xff0c;那它应该是对标这个职级该有的能力 什么样的工程师才能算高级&#xff1f;至少…

常见的网络安全攻击及防御技术概述

网络安全技术涉及从物理层到业务层的各个层面&#xff0c;贯穿产品设计到产品上线运营的全流程。现阶段网络攻击的方式和种类也随着互联网技术的发展而不断迭代&#xff0c;做好网络安全防护的前提是我们要对网络攻击有充分的了解。下文将抛砖引玉对常见的网络安全攻击及防御技…

Taro使用微信OCR插件无法调用onSuccess回调问题

Taro使用微信插件无法调用onSuccess回调问题小程序后台添加插件在开放社区购买相应的套餐详细步骤1.在app.config.js中添加如下代码2.在页面的page.config.js添加插件3.使用ocr-navigator识别身份证小程序后台添加插件 在开放社区购买相应的套餐 购买地址 详细步骤 1.在app.…

ChatGPT 用户破亿背后...

2022 年 12 月初&#xff0c;ChatGPT 被社会广泛讨论之初&#xff0c;我们就介绍了 ChatGPT 母公司 OpenAI 使用了身份云&#xff08;IDaaS&#xff09;服务。在当时&#xff0c;人们还在感慨 ChatGPT 上线不到一周时间用户量就突破百万&#xff0c;而仅仅在不到两个月后&#…

Java开发学习(四十九)----MyBatisPlus更新语句之乐观锁

1、概念 在讲解乐观锁之前&#xff0c;我们还是先来分析下问题: 业务并发现象带来的问题:秒杀 假如有100个商品或者票在出售&#xff0c;为了能保证每个商品或者票只能被一个人购买&#xff0c;如何保证不会出现超买或者重复卖 对于这一类问题&#xff0c;其实有很多的解决方…

【Linux】生产者消费者模型 - 详解

目录 一.生产者消费者模型概念 1.为何要使用生产者消费者模型 2.生产者消费者之间的关系 3.生产者消费者模型的优点 二.基于阻塞队列的生产消费模型 1.在阻塞队列中的三种关系 2.BlockingQueue.hpp - 阻塞队列类 3.LockGurad.hpp - RAII互斥锁类 4.Task.hpp - 在阻塞队…

TS 函数重载你还不会?来!我教你

前言&#xff1a; 今天在项目中遇到了后端接口参数类型和接口返回值需要修改的场景&#xff0c;由于这个函数在很多页面都用到了&#xff0c;就导致改完相关 api 函数的时候 TS 疯狂报错&#xff0c;所有的参数和返回值都需要跟着改&#xff0c;一时间头疼。正当我手足无措的时…

为什么选择pnpm

npm V3版本之前 问题1 会将模块对应的依赖装到当前模块下,那么如果有嵌套的话,依赖树就会比较深.这中长路径会导致在windows下是找不到的.有一句玩笑话是宇宙最深的不是黑洞而是nodemodules. 问题2 相同的包如果被不同的包依赖就会下载多个副本,造成磁盘空间的浪费 npm V…

知不知道什么叫米筐量化?怎么来的?

现在量化市场范围越来越大&#xff0c;各种量化系统也是普遍性的了&#xff0c;不过米匡量化这个开发系统通常是由交易接口的专业开发团队开发的的结果&#xff0c;那么米匡量化的终端又是是怎么开发成功的呢&#xff1f;首先&#xff0c;我们可以从api接口的调用来了解&#x…

高通开发系列 - 总目录

By: fulinux E-mail: fulinuxsina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅&#xff01; 你的喜欢就是我写作的动力&#xff01; 目录序言序言 大家好&#xff0c;欢迎进入《高通开发系列》专栏&#xff0c;小编有10余年嵌入式开发经验&#xff0c;…

77页智慧城市顶层设计方案

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a;篇幅有限&#xff0c;无法完全展…