leetCode 214.最短回文串 + KMP

news2024/10/13 0:36:49

给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。


示例 1:

输入:s = "aacecaaa"
输出:"aaacecaaa"

示例 2:

输入:s = "abcd"
输出:"dcbabcd"

>>关于KMP 算法 和 核心 j = D[j-1] 可以看一下我的往期文章:

KMP substring search 算法 案例分析-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_41987016/article/details/133908991?spm=1001.2014.3001.5501KMP 算法 + 详细笔记 + 核心分析 j = D[j-1]-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_41987016/article/details/133848188?spm=1001.2014.3001.5501>>KMP 解法

发现 s 最长前缀是回文的,它翻转之后的 rev_s 的最长后缀也是回文的,且 s 的最长回文前缀和res_s 的最长回文后缀是相等。(这是因为回文串经过翻转还是本身)

于是拼接:temp_s = s + '#' + rev_s = "haha#ahah",可以发现 temp_s的最长公共前后缀 正是其s 的最长回文前缀 和 res_s 的最长回文后缀。因为rev_s去掉最长回文后缀,剩余的与s拼接也就可以获得最短的回文串。那也就是rev_s去掉最长公共前后缀,剩余的与s拼接也就可以获得最短的回文串。

  • 1.翻转字符串:rev_s
  • 2.拼接:temp_s=s+'#'+rev_s
  • 3.求串temp_s的最长公共前后缀
  • 4.rev_s“砍去”最长公共前后缀,剩余的rev_s + s 为所求
class Solution {
public:
    // D[i]:D[0]~D[i] 共有 i+1 个字符的最大公共前后缀
    void getD(int D[],string pattern){
        int i=1,j=0;
        int np = pattern.size();
        while(i < np) {
            if(pattern[i] == pattern[j]) {
                D[i] = ++j;
                i++;
                // 可简写D[i++] = ++j;
            }else{
                if(j>0) j=D[j-1];
                else i++;
            }
        }
    }

    string shortestPalindrome(string s) {
        string rev_s = s;
        reverse(rev_s.begin(), rev_s.end());
        string temp_s = s + '#' + rev_s;
        int n = temp_s.size();
        int *D = new int [n]();
        getD(D,temp_s);
        return rev_s.substr(0,rev_s.size()-D[n-1]) + s.substr(0, s.size());
    }
};

参考和推荐文章:

214. 最短回文串 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/shortest-palindrome/solutions/392676/shou-hua-tu-jie-cong-jian-dan-de-bao-li-fa-xiang-d/

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

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

相关文章

【Java学习之道】JDBC API介绍与使用方法

引言 对于初学者来说&#xff0c;数据库编程可能听起来有些复杂&#xff0c;但实际上&#xff0c;只要你掌握了JDBC&#xff08;Java Database Connectivity&#xff09;API&#xff0c;就可以轻松地连接和操作数据库。本章将为你详细介绍JDBC API的概念、使用方法以及一些实际…

2023年信息院学生科协第二次硬件培训

2023年信息院学生科协第二次硬件培训 前言一、51单片机简介1、什么是单片机2、主流单片机及其编程语言3、单片机的应用4、单片机开发软件 二、GPIO&#xff08;点亮LED&#xff09;1、GPIO简介2、LED简介3、硬件设计4、软件设计 三、GPIO&#xff08;独立按键&#xff09;1、按…

ifndef是什么,如何使用?

引言 使用HbuilderX uni-ui模板创建的uni-app项目&#xff0c;main.js文件中看到有如下的注释&#xff1a; // #ifndef VUE3 ...... // #endif // #ifdef VUE3 ...... // #endif 相信很多没有uini-app项目开发经验的朋友&#xff0c;初次接触uni-app项目&#xff0c;可…

分类预测 | MATLAB实现基于LSTM-AdaBoost长短期记忆网络结合AdaBoost多输入分类预测

分类预测 | MATLAB实现基于LSTM-AdaBoost长短期记忆网络结合AdaBoost多输入分类预测 目录 分类预测 | MATLAB实现基于LSTM-AdaBoost长短期记忆网络结合AdaBoost多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.分类预测 | MATLAB实现基于LSTM-Ada…

Android 虚拟 A/B 详解(十) 判断 Virtual A/B 是否打开的 5 种办法.md

文章目录 0. 导读1. Virtual A/B 的开关1.1 编译开关1.2 编译开关的定义位置1.3 编译开关的作用 2. Virtual A/B 开关检查方法 1. 从源码判断示例 1. Broadcom 平台示例 2. Google 平台 方法 2、从编译输出判断方法 3、从 image 镜像文件判断示例 1. 从 super.img 判断示例 2. …

强化学习(reinforcement)

B站链接 https://www.bilibili.com/video/BV13a4y1J7bw?p1&vd_source6f43d02eb274352809b90e8cdf744905 agent----------environment--------goal State 状态 Action 行动 Reward奖励 是一个及时的反馈 目标是一个长远的结果 Core element&#x1f447; Policy 策略…

jQuery实现简易购物车

购物车中的商品列表如下&#xff1a; 需求如下&#xff1a; &#xff08;1&#xff09;实现如图所示商品列表 &#xff08;2&#xff09;单击’移出’按钮可用删除商品 &#xff08;3&#xff09;单击’全选’按钮选中所有商品 &#xff08;4&#xff09;根据用户的选择&am…

c++学习笔记汇总

[TOC] (C学习笔记汇总) 基础认识、基础语法 类、类与类之间的关系、可调用对象、std::function类模板、c11新标准、资源管理方案RAII、指针、智能指针、引用计数、C的多态 ios、istream、iostream、fstream、sstream 模板编程&#xff1a; 模板编程&#xff1a;主要分为“泛…

uniapp 安装 u-view 组件库

u-view 组件库安装教程&#xff1a;https://uviewui.com/components/install.html 注&#xff1a;以下使用 HBuilderx 安装 u-view 2.0 版本&#xff0c;不适用于其它版本。 1.安装 u-view 组件库 2、注册并登录 HBuilderx 账号&#xff0c;点击下载 u-view 组件库。 3、点击…

[Model.py 02] 地图按比例放大的实现

要求&#xff1a;实现地图按比例放大 分析&#xff1a;考虑到地图放大过程中需要保留河流道路这些物体的相对位置关系&#xff0c;这里选择将河流和道路这些物体的坐标矩阵合并成terrain_matrix并对这个合并后的矩阵进行缩放处理。放大后的矩阵&#xff0c;根据矩阵中标记的物…

如何处理前端响应式图片?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Jenkins+vue发布项目

在Jenkins 中先创建一个任务名称 然后进行下一步&#xff0c;放一个项目 填写一些参数 参数1&#xff1a; 参数2&#xff1a; 参数3&#xff1a;参数4&#xff1a; 点击保存就行了 配置脚本 // git def git_url http://gitlab.xxxx.git def git_auth_id GITEE_RIVER…

面试题:线程池中线程抛了异常,该如何处理?

文章目录 1. 模拟线程池抛异常2. 如何获取和处理异常方案一&#xff1a;使用 try -catch方案二&#xff1a;使用Thread.setDefaultUncaughtExceptionHandler方法捕获异常方案三&#xff1a;重写afterExecute进行异常处理 1. 模拟线程池抛异常 在实际开发中&#xff0c;我们常常…

2023年【四川省安全员A证】模拟试题及四川省安全员A证作业模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年四川省安全员A证模拟试题为正在备考四川省安全员A证操作证的学员准备的理论考试专题&#xff0c;每个月更新的四川省安全员A证作业模拟考试祝您顺利通过四川省安全员A证考试。 1、【多选题】36V照明适用的场所条…

嵌入式实时操作系统的设计与开发 (中断管理)

中断发生及响应 硬件抽象HAL层响应 中断请求IRQ被中断控制器汇集成中断向量&#xff08;Interrupt Vector&#xff09;&#xff0c;每个中断向量对应一个中断服务程序ISR&#xff0c;中断向量存放了ISRs的入口地址或ISRs的第一条指令。 系统中通常包含多个中断向量&#xff0…

PyTorch深度学习实战(22)——从零开始实现YOLO目标检测

PyTorch深度学习实战&#xff08;22&#xff09;——从零开始实现YOLO目标检测 0. 前言1. YOLO 架构1.1 R-CNN 目标检测模型的局限性1.2 YOLO 目标检测模型原理 2. 实现 YOLO 目标检测2.1 编译 DarkNet2.2 设置数据集格式2.3 配置网络架构2.4 模型训练和测试 小结系列链接 0. 前…

C# 关于托管调试助手 “FatalExecutionEngineError“:“运行时遇到了错误。解决方案

托管调试助手 “FatalExecutionEngineError”:“运行时遇到了错误。此错误的地址为 0x740161f8&#xff0c;在线程 0x1174 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug&#xff0c;或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 …

手术麻醉临床信息管理系统源码,客户端可以接入监护仪、麻醉机、呼吸机

一、手术麻醉临床信息管理系统介绍 1、手术麻醉临床信息管理系统是数字化手段应用于手术过程中的重要组成部分&#xff0c;用数字形式获取并存储手术相关信息&#xff0c;既便捷又高效。既然是管理系统&#xff0c;那就是一整套流程&#xff0c;管理患者手术、麻醉的申请、审批…

【C语言】输入一个正整数,判断其是否为素数

1、素数又叫质数。素数&#xff0c;指的是“大于1的整数中&#xff0c;只能被1和这个数本身整除的数”。 2、素数也可以被等价表述成&#xff1a;“在正整数范围内&#xff0c;大于1并且只有1和自身两个约数的数”。 #include<stdio.h>int main() {int i,m;printf("…

如何实现前端社交媒体分享功能?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…