Leetcode面试经典150题-5.最长回文子串

news2024/11/15 13:56:53

 解法都在代码里,不懂就留言或者私信

class Solution {

    public static String longestPalindrome(String s) {

        if(s == null || s.length() == 0) {

            return null;

        }

        //加工字符串,例如abcdcba加工成#a#b#c#d#a#b#c#d#

        String str = getManacherString(s);

        char[] strArr = str.toCharArray();

        int[] pArr = new int[strArr.length];

        //回文区域的最右边的下一个位置

        int R = -1;

        //把回文区域推到R-1的圆心位置,R更新的话C一定要更新

        int C = -1;

        //记录最大的递归半径

        int max = 1;

        //end用来表示max最大时候的递归范围的右边界

        int end = -1;

        for(int i = 0; i < strArr.length; i++) {

            //R是原来推到的最右位置的下一个位置,R=i的时候,i就在原来的最远区域的外面了

            //R>i代表i还在原来推到的最远的右边界内

            //先赋值一个不用验证的范围:如果在R外则最小半径是1,在R外则取Math.min(pArr[2*C - i], R - i)

            //为什么这个区域不用验证看<https://www.xiaohuazhuo.com/board/656b07678b0e1e0a7cc8784a>

            //1.如果i在C的递归范围以内(R>i),分为三种情况

            //(1) 如果i关于C对称的位置i1的递归左边界在L~R之间,则i的递归半径与i1相同,递归右边界在R之前,递归直径为pArr[2*C-i],这种情况这个值比R-i小

            //(2) 如果i关于C对称的位置i1的递归左边界在L之前,则i的递归右边界是R,递归半径是R-i,这种情况R-i比pArr[2*C-i]要小

            //(3) 如果i关于C的对称的位置i1的递归左边界刚好就是L,则i位置的递归右边界至少为R,递归半径至少为R-i,这种情况R-i>=pArr[2*C-i]

            //这三种情况的最小值都是Math.min(pArr[2*C - i]),前两种情况的递归半径是确定的,第三种情况仍有继续扩大的可能

            //2如果i在C的递归范围以外(R<=i)则递归半径至少=1是不用证明的,这种情况就是两边都扩不了(该位置自身)

            //我们可以通过pArr[i]=1这种情况可以想到C+pArr[i]肯定是以R为中心的递归范围的下一个位置

            pArr[i] = R > i? Math.min(pArr[2*C - i], R - i) : 1;

            //如果以i为中心的递归范围的左边前一个位置strArr[i+pArr[i]]和右边后一个位置strArr[i-pArr[i]]相等,则递归半径+1

            while(i+pArr[i] < strArr.length && i - pArr[i] >= 0 && strArr[i+pArr[i]] == strArr[i-pArr[i]]) {

                pArr[i] ++;

            }

            if(pArr[i] + i > R) {

                R = pArr[i] + i;

                C = i;

            }

            //这里需要写个if,因为要获取end,end

            if(pArr[i] > max) {

                max = pArr[i];

                end = i + pArr[i]-1;

            }

            //max = Math.max(max, pArr[i]);

        }

        //最大递归范围的终点是end,最大的半径是(max-1)/2,则范围为end - 2*(max-1)~end

        //end对应原数组的位置就是(end-1)/2,这里注意的是subString这个方法的范围是[start,end)前闭后开的区间

        //原数组中的每个位置在新的manacher数组中的下标是2*i+1,在新数组中第一个位置为end-2*(max-1)+1,对应的原数组的下标为(end-2*(max-1))/2

        //(end-2*(max-1))/2=end/2-(max-1)=end/2-max+1

        //而结束位置为end,对应原数组的位置为(end-1)/2,但是第二个参数是开区间,所以应该写成(end-1)/2 + 1= (end+1)/2

        return s.substring(end/2-max+1,(end+1)/2);

    }



    public static String getManacherString(String s) {

        char[] sArr = s.toCharArray();

        char[] strArr = new char[sArr.length * 2 + 1];

        strArr[0] = '#';

        for(int i = 1; i < strArr.length; i++) {

            if((i & 1) == 1) {

                strArr[i] = sArr[i/2];

            } else {

                strArr[i] = '#';

            }

        }

        return String.valueOf(strArr);

    }

}

9383a517afcb4d949a908bed068f140b.jpg

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

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

相关文章

UWB实操:用litepoint确认UWB SP0和SP3帧长度

用litepoint确认UWB SP0和SP3帧长度 预备知识 SP0 frame length Sync+SFD = 65.1+ 8.1 = 73 us

uniapp定义scss颜色变量deep()修改子组件样式

uni.scss中 import "/common/style/base-style.scss"; 在base-style.scss中 $brand-theme-color:#28B389;//品牌主体红色$border-color:#e0e0e0 ; $border-color-light:#efefef; $text-font-color-1: #000 ;//文字主色 $text-font-color-2:#676767;//副标题颜色 $…

​​聆思CSK6大模型语音视觉开发板接入AIUI技能实操(控制风扇开关)

前言 本文以大模型语音控制灯的开关为例,讲解如何通过LSPlatform的云端编排功能在大模型语音交互流程中加入AIUI技能&#xff0c;实现更丰富的产品功能。 大模型语音模板加入AIUI技能节点后的数据流程如下图所示&#xff1a; 大模型语音控制AIUI之风扇 硬件准备工作 聆思CSK6大…

使用 FinalShell 链接 Centos

1. 安装 FinalShell 下载地址&#xff1a;https://www.hostbuf.com/t/988.html 2. 查看 IP地址。 2.1 通过命令查询IP 输入 ip addr show 查询&#xff0c;输出效果如下截图&#xff0c;其中的 192.168.1.5 就是 IP 地址。 2.2 通过可视化界面查询IP 点击右上角的网络图标…

LLM自对齐技术最新研究分享(二):对齐 Pipeline 数据合成(下)

LLM 自对齐技术最新研究进展分享 系列文章继续更新啦&#xff01;本系列文章将基于下图的架构&#xff0c;对当前 Self-alignment 相关工作进行全面梳理&#xff0c;厘清技术路线并分析潜在问题。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 在上一篇…

MySQL数据库——概念与安装

目录 一、数据库的概述 1、数据库的基本概念 2、数据库管理系统&#xff08;DBMS&#xff09; 2.1、数据库管理系统概述 2.2、DBMS的工作模式 3、数据库系统&#xff08;DBS&#xff09; 3.1、数据库系统概述 3.2、数据库系统发展史 3.3、当今主流数据库介绍 4、关系…

VS2022离线安装包 - 下载安装教程

总目录 前言 一般情况下我们都是通过网络下载并安装VS2022&#xff0c;但是有些情况下&#xff0c;由于公司内部网络管理比较严格&#xff0c;可能会需要安装离线安装包这样的操作。 一、下载Visual Studio bootstrapper 进入Visual Studio bootstrapper下载界面按照如下图示…

angular xlsx-style,复杂表头样式导出

导出效果如下图所示&#xff1a; 下载xlsx npm install xlsx angular.json中引入&#xff1a; "node_modules/xlsx/dist/xlsx.full.min.js","src/assets/js/jszip.js","src/assets/js/xlsx.js" 两个插件地址&#xff1a; 上传中&#xff0c;等…

Android U WMShell动画调用堆栈

本文主要简单介绍WMShell动画调用堆栈 代码环境&#xff1a;repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-14.0.0_r7 Systemserver侧 TAG: at com.android.server.wm.Transition.onTransactionReady(Transition.java:1575) TA…

Centos 设置成中国时区

原因是初始安装的 Centos 系统&#xff0c;时区是UTC&#xff0c;跟中国时间不一样&#xff0c;这样会导致一些问题&#xff0c;例如后面安装一些软件&#xff0c;证书认证失败等问题。 修改时间命令如下 1.首先&#xff0c;使用以下命令安装 tzdata 软件包&#xff08;如果尚…

喜羊羊做Python二级(模拟考试--易错点)

今天距离Python二级考试&#xff0c;还有28天左右。坚持每天做几套试卷&#xff0c;保持记忆和手感。 个人在做题的过程中是先不断练习选择题。当你选择题不达标的时候&#xff0c;系统不会看大题&#xff08;大概是觉得选择题都做的那么差&#xff0c;大题也不会那么好&#…

数据执行保护讲解

数据执行保护&#xff08;Data Execution Prevention&#xff0c;简称DEP&#xff09;操作系统中的一项安全功能&#xff0c;旨在防止恶意代码利用缓冲区溢出漏洞执行。它通过将内存的某些区域标记为不可执行&#xff0c;从而防止从这些区域执行代码。这适用于所有程序&#xf…

05:【江科大stm32】:定时器输出比较功能(PWM)

定时器输出比较功能&#xff08;PWM&#xff09; 1、LED呼吸灯2、PWM驱动舵机3、PWM驱动电机 1、LED呼吸灯 ①PWM.c文件的代码如下&#xff1a; #include "stm32f10x.h" // Device header/*使用定时器TIM2&#xff0c;通过通道CH1(PA0)输出PWM波 …

模型 PMI思考法

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。全面评估&#xff0c;三思而后行。 1 PMI思考法的应用 1.1 个人职业发展中的PMI思考法应用 张华是一位有志于提升自己职业竞争力的职场人士。他正在考虑报名参加一个专业认证课程&#xff0c;以期提…

Windows安装Ora2Pg(迁移表结构,表数据)

版本&#xff1a; windows server 2012 R2 oracle 12 说明&#xff1a; 目前该操作是在安装了oracle的机子上做的。 1、安装perl Strawberry Perl下载地址&#xff1a; Strawberry Perl for Windows - Releases 选择一个合适的版本&#xff0c;下载下来之后只需要选择…

百度广告联盟:抢占流量蓝海,精准营销新引擎

百度广告联盟&#xff1a;抢占流量蓝海&#xff0c;精准营销新引擎 在数字营销时代&#xff0c;争夺消费者的注意力与流量成为品牌竞争的关键。百度广告联盟&#xff0c;作为互联网营销领域的佼佼者&#xff0c;凭借其广泛的平台覆盖、精准的受众定位以及丰厚的合作回报…

水稻病害-目标检测数据集(包括VOC格式、YOLO格式)

水稻病害-目标检测数据集&#xff08;包括VOC格式、YOLO格式 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1eiygobnVJklOdgyCwb2RVg?pwdvsoc 提取码&#xff1a;vsoc 数据集信息介绍&#xff1a; 共有 2148 张图像和一一对应的标注文件 标注文件格式提供了…

《深入浅出WPF》读书笔记.8路由事件

《深入浅出WPF》读书笔记.8路由事件 背景 路由事件是直接响应事件的变种。直接响应事件&#xff0c;事件触发者和事件响应者必须显示订阅。而路由事件的触发者和事件响应者之间的没有显示订阅&#xff0c;事件触发后&#xff0c;事件响应者安装事件监听器&#xff0c;当事件传…

MySQL EXPLAIN 完全解读

MySQL EXPLAIN 完全解读 一、一个EXPLAIN简单执行二、简单了解2.1. id&#xff1a;查询的标识符。2.2. select_type&#xff1a;查询的类型。2.3. table&#xff1a;输出结果集的表。2.4. type&#xff1a;连接类型&#xff0c;这是MySQL决定如何查找表中行的方法。2.5. possib…

学习之数据库相关概念

数据库相关概念 主流的关系型数据库管理系统&#xff1a;