​LeetCode刷题实战214:最短回文串

2023-11-04

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 最短回文串,我们先来看题面:

https://leetcode-cn.com/problems/shortest-palindrome/

You are given a string s. You can convert s to a palindrome by adding characters in front of it.

Return the shortest palindrome you can find by performing this transformation.

题意

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

示例

示例 1:

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

示例 2:

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

0 <= s.length <= 5 * 104
s 仅由小写英文字母组成

解题

https://blog.csdn.net/qq_41231926/article/details/86747126

思路一:暴力破解法

要找到满足题目要求的最短回文串,本质是要找到最长的回文子串,该子串的左端点与字符串s的左端点重合。

时间复杂度是O(n ^ 2),其中n为字符串s的长度。空间复杂度是O(n)。

JAVA代码:

class Solution {
    public String shortestPalindrome(String s) {
        int index = -1;
        for(int i = s.length() - 1; i >= 0; i--){
            if(isPalindrome(s.substring(0, i + 1))){
                index = i;
                break;
            }
        }
        String result = reverse(s.substring(index + 1));
        return result + s;
    }
    private String reverse(String s){
        StringBuilder stringBuilder = new StringBuilder(s);
        return stringBuilder.reverse().toString();
    }
    private boolean isPalindrome(String s){
        for(int i = 0; i < s.length() / 2; i++){
            if(s.charAt(i) != s.charAt(s.length() - 1 - i)){
                return false;
            }
        }
        return true;
    }
}

思路二:递归解法

左指针i初始化为0,右指针j从n - 1递减到0,其中n为字符串s的长度,一旦遇上i指向的字符与j指向的字符相等时,令i指针加1。

递归出口:

如果i指针最后的值等于n,说明字符串s本身就是回文串,直接返回s即可。

递归过程:

首先明确一点:我们所要寻找的最长回文子串,该子串的左端点与字符串s的左端点重合,一定在[0, i)范围内。

考虑两种极端情况,第一种情况:字符串s本身就是回文串,显然满足条件。第二种情况:在遍历过程中,不存在i指向的字符与j指向的字符相等的情况,除了i和j相等时,这种情况我们得到的i是1。显然也满足条件。

考虑一般性情况:假设我们所要寻找的最长回文子串不在[0, i)范围内,即存在回文串其在[0, k)范围内,其中k > i。那么显然,在我们遍历的过程中,即使j在[k, n - 1]范围时不存在i指向的字符与j指向的字符相等的情况,最终i的值也会到达k,即i >= k,这显然矛盾了,因此该结论成立。

由上述结论,我们得出:[i, n - 1]范围内的子串一定不是我们所要寻找的最长回文子串的一部分。

这样,我们就可以递归地反转[0, i)范围内的子串来拼接出结果。

时间复杂度是O(n ^ 2),其中n为字符串s的长度。空间复杂度是O(n)。

JAVA代码:

class Solution {
    public String shortestPalindrome(String s) {
        int i = 0;
        for(int j = s.length() - 1; j >= 0; j--){
            if(s.charAt(j) == s.charAt(i)){
                i++;
            }
        }
        if(i == s.length()){
            return s;
        }
        return reverse(s.substring(i)) + shortestPalindrome(s.substring(0, i)) + s.substring(i);
    }
    private String reverse(String s){
        StringBuilder stringBuilder = new StringBuilder(s);
        return stringBuilder.reverse().toString();
    }
}

思路三:KMP算法

将原字符串s和其逆序字符串用“#”拼接在一起,利用KMP算法中next数组的求法求得拼接出的新字符串的最长相同前后缀,就是原字符串s中最长的回文子串,该子串的左端点与字符串s的左端点重合。

这个问题是一个动态规划问题:求取字符串s中的最长相同前后缀(不能是其本身)

状态定义:

f(x) -------- 字符串s中[0, x]范围内的最长相同前后缀(不能是其本身)的长度

状态转移:

首先是初始化,f(0)显然是0,因为[0, 0]范围内的字符串长度为1,其最长相同前后缀根本不存在。

对于i在[1, n - 1](其中n为字符串s的长度)范围内的值:

(1)令temp记录f(x - 1)的值,如果temp大于0且s中temp位置的字符和第i个字符不相同,那么我们就需要重设temp的值为f(temp - 1)。

(2)如果s中第i个字符与第temp个字符相同,令temp自增1。

(3)f(i) = temp。

上述状态转移过程可能很难理解,以一个例子——“ABABCABAA”来说明,其子串如下:

A -------------------------------------------------- 0

AB ------------------------------------------------ 0

ABA ---------------------------------------------- 1

ABAB -------------------------------------------- 2

ABABC ------------------------------------------ 0

ABABCA ---------------------------------------- 1

ABABCAB -------------------------------------- 2

ABABCABA ------------------------------------ 3

ABABCABAA ---------------------------------- 1

对由ABAB求得ABABC这个过程进行分析:

C和A不相等,因此结果不可能是3,如果是ABABA,则结果是3。ABAB的结果是2,因此我们知道AB和AB相同,但是第一个AB之后跟着的是A,依然和C不相同。我们继续看AB,AB的结果是0,因此我们知道AB中A和B不相同,而C和A不相同,因此结果是0。

对由ABABCABA求得ABABCABAA这个过程进行分析:

A和B不相等,因此结果不可能是4,如果是ABABCABAB,则结果是4。ABABCABA的结果是3,因此我们知道ABA和ABA相同,但是第一个ABA之后跟着的是B,依然和A不相同。我们继续看ABA,ABA的结果是1,但是第一个A之后跟着的是B,依然和A不相同。我们继续看A,结果是0,结束while循环。这个A和A相同,因此其值加1变成1。

时间复杂度和空间复杂度均是O(n),其中n为字符串s的长度。

JAVA代码:

class Solution {
    public String shortestPalindrome(String s) {
        String rev = reverse(s);
        String temp = s + "#" + rev;
        int[] next = getNext(temp);
        return rev.substring(0, rev.length() - next[temp.length() - 1]) + s;
    }
    private String reverse(String s){
        StringBuilder stringBuilder = new StringBuilder(s);
        return stringBuilder.reverse().toString();
    }
    private int[] getNext(String s){
        int[] result = new int[s.length()];
        result[0] = 0;
        for(int i = 1; i < result.length; i++){
            int temp = result[i - 1];
            while(temp > 0 && s.charAt(i) != s.charAt(temp)){
                temp = result[temp - 1];
            }
            if(s.charAt(i) == s.charAt(temp)){
                temp++;
            }
            result[i] = temp;
        }
        return result;
    }
}

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-200题汇总,希望对你有点帮助!

LeetCode刷题实战201:数字范围按位与

LeetCode刷题实战202:快乐数

LeetCode刷题实战203:移除链表元素

LeetCode刷题实战204:计数质数

LeetCode刷题实战205:同构字符串

LeetCode刷题实战206:反转链表

LeetCode刷题实战207:课程表

LeetCode刷题实战208:实现 Trie (前缀树)

LeetCode刷题实战209:长度最小的子数组

LeetCode刷题实战210:课程表 II

LeetCode刷题实战211:添加与搜索单词

LeetCode刷题实战212:单词搜索 II

LeetCode刷题实战213:打家劫舍 II

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

​LeetCode刷题实战214:最短回文串 的相关文章

随机推荐

  • 软件项目管理课程授课教案

    序 软件项目管理概述 第一篇 软件项目初始 第1章 软件项目初始过程 第二篇 软件项目计划 第2章 软件项目范围计划 第3章 软件项目进度计划 第4章 软件项目成本计划 第5章 软件项目质量计划 第6章 软件项目人力资源计划 第7章 软件项
  • 灵创系统服务器,服装ERP-灵创软件-ICSCM供应链管理系统

    服装ERP 灵创软件 ICSCM供应链管理系统 一 产品概述 ICSCM供应链管理系统是基于品牌营运商和产品生产商之间紧密沟通 风险利润分担的大前提下诞生的一套全B S结构的系统 它是一种致力于在企业与供应商之间建立和维持长久的紧密合作伙伴
  • STM32系列(HAL库)——F103C8T6获取DHT11温湿度串口打印

    本文参考此篇博客并在其基础上进行了修改 STM32F103驱动DHT11温湿度传感器 STM32MXcube HAL 在此特别鸣谢原文博主 1 软件准备 1 编程平台 Keil5 2 CubeMX 3 XCOM 串口调试助手 2 硬件准备
  • Manifest.json文档说明

    Manifest json文件是5 移动App的配置文件 用于指定应用的显示名称 图标 应用入口文件地址及需要使用的设备权限等信息 是扩展的配置文件 指明了扩展的各种信息 一个manifest json格式如下 必须的字段3个 name M
  • Spring bean生命周期详解

    Spring Bean的完整生命周期从创建Spring容器开始 直到最终Spring容器销毁Bean 这其中包含了一系列关键点 Spring bean生命周期 四个阶段 Bean的实例化阶段 Bean的设置属性阶段 Bean的 初始化阶段
  • token续期

    需求 项目前后端分离 采用token jwt生成 方式作为登录及接口验证 自然而然就会涉及token超时 影响用户体验的问题 要解决的就是如果用户一直点击页面 就不应该出现超时及重新登录 只有用户在设置的超时时间内 一次页面操作都没有 才定
  • 大白话给你说清楚什么是过拟合、欠拟合以及对应措施

    开始我是很难弄懂什么是过拟合 什么是欠拟合以及造成两者的各自原因以及相应的解决办法 学习了一段时间机器学习和深度学习后 分享下自己的观点 方便初学者能很好很形象地理解上面的问题 同时如果有误的地方希望大家在评论区留下你们的砖头 我会进行纠正
  • 计算机故障诊断知识,故障诊断

    利用各种检查和测试方法 发现系统和设备是否存在故障的过程是故障检测 而进一步确定故障所在大致部位的过程是故障定位 故障检测和故障定位同属网络生存性范畴 要求把故障定位到实施修理时可更换的产品层次 可更换单位 的过程称为故障隔离 故障诊断就是
  • UE4Material_材质属性(1)

    材质中的属性 物理材质 Phys Material 物理材质 与该材质关联的物理材质 物理材质 Physical Material 提供了物理属性的定义 例如碰撞 弹力 以及其他基于物理的方面会保留多少能量 物理材质 Physical Ma
  • 一篇教会你,Redis主从、哨兵、 Cluster集群。

    前言 大家好 今天跟小伙伴们一起学习Redis的主从 哨兵 Redis Cluster集群 Redis主从 Redis哨兵 Redis Cluster集群 1 Redis 主从 面试官经常会问到Redis的高可用 Redis高可用回答包括两
  • TCP的三次握手及四次挥手总结(从抓包角度理解)

    目录 TCP报文首部 TCP连接 传输及断开过程图 TCP状态图 三次握手过程理解 四次挥手过程理解 从抓包来理解TCP建立连接 数据传输以及断开连接的过程 建立连接过程 数据传输过程 连接断开过程 为什么连接的时候是三次握手 关闭的时候却
  • Keras查看model weights .h5 文件的内容

    Keras的模型是用hdf5存储的 如果想要查看模型 keras提供了get weights的函数可以查看 for layer in model layers weights layer get weights list of numpy
  • 多进程浏览器框架

    为什么浏览器采用多进程模型 转载于 http www wtoutiao com p s57age html Google Chrome源码剖析 一 多线程模型 转载于 http www ha97 com 2908 html 主流浏览器多进程
  • 【广州华锐互动】无人值守变电站AR虚拟测控平台

    无人值守变电站AR虚拟测控平台是一种基于增强现实技术的电力设备巡检系统 它可以利用增强现实技术将虚拟信息叠加在真实场景中 帮助巡检人员更加高效地完成巡检任务 这种系统的出现 不仅提高了巡检效率和准确性 还降低了巡检成本和风险 传统的变电站巡
  • TPM功能介绍

    文章来源 TPM功能介绍 百度文库 http wenku baidu com link url bQMQyb0A3gto0CCC2CN5ojpUrgHsh8BMXmejpFaqLS52v 013bXPHoRr36r0F0UrgPr8U6rv
  • MATLAB——FFT(快速傅里叶变换)

    基础知识 FFT即快速傅里叶变换 利用周期性和可约性 减少了DFT的运算量 常见的有按时间抽取的基2算法 DIT FFT 按频率抽取的基2算法 DIF FFT 1 利用自带函数fft进行快速傅里叶变换 若已知序列 x 4 3
  • 利用ChatGPT协助编写单元测试

    ChatGPT自从2022年推出以来受到很多人的喜欢 此篇博客重点介绍如何修改Prompt来自动生成较理想的单元测试 如下图所示的一段代码 该class中有一个public方法toLocale 其余都是private方法 toLocale
  • 编写代码的几个tip

    使用的大多是MVC的模式 那么视图就只管视图 逻辑就只管逻辑 一个自定义的cell 上面放了一个button button的点击事件用一个delegate在viewcontroller中来实现 比如先要变化cell的样式 那么代理方法中 不
  • 攻防世界WEB入门

    1 view source X老师让小宁同学查看一个网页的源代码 但小宁同学发现鼠标右键好像不管用了 WP 按F12即可在elements中看到flag 2 robots X老师上课讲了Robots协议 小宁同学却上课打了瞌睡 赶紧来教教小
  • ​LeetCode刷题实战214:最短回文串

    算法的重要性 我就不多说了吧 想去大厂 就必须要经过基础知识和业务逻辑面试 算法面试 所以 为了提高大家的算法能力 这个公众号后续每天带大家做一道算法题 题目就从LeetCode上面选 今天和大家聊的问题叫做 最短回文串 我们先来看题面 h