LeetCode.5-最长回文子串(Longest Palindromic Substring)

手把手教你用RC桥式振荡器生成1Hz-1MHz正弦波(附完整电路图) 本文详细介绍了如何从零构建RC桥式振荡器,实现1Hz-1MHz正弦波的生成。通过核心元件选型、参数设计、电路搭建与优化等步骤,帮助读者掌握振荡器的工作原理和实战技巧。特别适合电子实验和信号处理领域的初学者和工程师,附完整电路图和常见问题解决方案。 阅读详情

这是悦乐书的第342次更新,第366篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Medium级别的第3题(顺位题号是5)。给定一个字符串s,找到s中最长的回文子字符串。 您可以假设s的最大长度为1000。例如:

输入:“babad”
输出:“bab”
注意:“aba”也是一个有效的答案。

输入:“cbbd”
输出:“bb”

02 第一种解法

暴力解法。
使用两层循环截取出所有的子串,判断该子串是否是回文,从中取长度最长的子串作为结果输出。
此解法时间复杂度是O(N^3),空间复杂度是O(1)。

public String longestPalindrome(String s) {
    int max = 0, n = s.length();
    String result = "";
    for (int i=0; i<n; i++) {
        for (int j=i+1; j<=n; j++) {
            String tem = s.substring(i,j);
            if (isPalindrome(tem)) {
                if (j-i > max) {
                    max = j-i;
                    result = tem;
                }
            }    
        }
    }
    return result;
}

public boolean isPalindrome(String s){
    int left = 0, right = s.length()-1;
    while (left < right) {
        if (s.charAt(left) != s.charAt(right)) {
            return false;
        }
        left++;
        right--;
    }
    return true;
}

03 第二种解法

我们也可以换一种找回文的方式,从左右两边向中间变成由中间向左右两边。

此时需要考虑回文的长度是奇数还是偶数的情况,如果是奇数形回文,就以当前字符为中心左右两边寻找,例如回文"bab";如果是偶数形回文,需要两个字符,并且这两个字符是相等的,则需要以当前字符和其相邻的字符为中心向左右两边寻找,例如回文"abba"。

此解法的时间复杂度是O(N^2),空间复杂度是O(1)。

public String longestPalindrome2(String s) {
    if (s.length() < 2) {
        return s;
    }
    int n = s.length(), start = 0, end = 0;
    for (int i=0; i<n-1; i++) {
        int len = helper(s, i, i);
        int len2 = helper(s, i, i+1);
        int len3 = Math.max(len, len2);
        if (len3 > end - start) {
            start = i - (len3-1)/2;
            end = i + len3/2;
        }
    }
    return s.substring(start, end+1);
}

/**
 * 以当前字符为中心向左右两边扩散,寻找回文子串
 * @param s 字符串
 * @param left 起始索引
 * @param right 结束索引
 * @return 回文子串长度
 */
public int helper(String s, int left, int right) {
    int n = s.length(), L = left, R = right;
    while (L >= 0 && R < n && s.charAt(L) == s.charAt(R)) {
        // 继续向左寻找
        L--;
        // 继续向右寻找
        R++;
    }
    return R - L -1;
}

04 第三种解法

动态规划算法,用空间换时间,是对第一种解法的改进。
此解法的时间复杂度是O(N^2),空间复杂度是O(N^2)。

public String longestPalindrome3(String s) {
        if (s.length() < 2) {
            return s;
        }
        int n = s.length(), start = 0, end = 0;
        int maxLen = 0;
        // dp[j][i]表示子串[j,i]是回文
        boolean[][] dp = new boolean[n][n];
        // 右边界
        for (int i=0; i<n; i++) {
            // 左边界
            for (int j=i; j>=0; j--) {
                if (i == j) {
                    dp[j][i] = true;
                } else if (s.charAt(i) == s.charAt(j)) {
                    // 回文中至少3个字符
                    if (j < i-1) {
                        dp[j][i] = dp[j+1][i-1];
                    } else {
                        dp[j][i] = true;
                    }
                } else {
                    dp[i][j] = false;
                }
                // 比较最大值,并重新赋值
                if (i-j+1 > maxLen && dp[j][i]) {
                    maxLen = i-j+1;
                    start = j;
                    end = i;
                }
            }
        }
        return s.substring(start, end+1);
    }

05 第四种解法

马拉车算法(Manacher’s Algorithm),来自于讨论区,这是第一次听说这种算法,将时间复杂度降低到了O(N),也是很厉害了,后续抽时间来详细了解下这个算法。

public String longestPalindrome4(String s) {
    String T = preProcess(s);
    int n = T.length();
    int[] P = new int[n];
    int C = 0, R = 0;
    for (int i = 1; i < n - 1; i++) {
        int i_mirror = 2 * C - i;
        if (R > i) {
            P[i] = Math.min(R - i, P[i_mirror]);
        } else {
            P[i] = 0;
        }
        while (T.charAt(i + 1 + P[i]) == T.charAt(i - 1 - P[i])) {
            P[i]++;
        }
        if (i + P[i] > R) {
            C = i;
            R = i + P[i];
        }
    }
    int maxLen = 0;
    int centerIndex = 0;
    for (int i = 1; i < n - 1; i++) {
        if (P[i] > maxLen) {
            maxLen = P[i];
            centerIndex = i;
        }
    }
    int start = (centerIndex - maxLen) / 2; 
    return s.substring(start, start + maxLen);
}

/**
 * 
 * @param s
 * @return
 */
public String preProcess(String s) {
    int n = s.length();
    if (n == 0) {
        return "^$";
    }
    String ret = "^";
    for (int i = 0; i < n; i++) {
        ret += "#" + s.charAt(i);
    }
    ret += "#$";
    return ret;
}

06 小结

算法专题目前已连续日更超过六个月,算法题文章211+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

制作3D地形图的方法-使用GlobalMapper和3ds Max软件 打开GlobalMapper软件,在菜单栏中选择“文件”>“打开数据文件”,然后选择相应的高程数据文件。在菜单栏中选择“渲染”>“渲染设置”,根据需要进行设置,如分辨率和输出格式。选择地形对象,点击菜单栏中的“渲染”>“材质编辑器”,然后根据需要调整材质属性,如颜色、纹理和光照等。在菜单栏中选择“工具”>“高程栅格和网格”>“创建地形网格”。在菜单栏中选择“文件”>“导出”>“导出栅格格式”。打开3ds Max软件,在菜单栏中选择“文件”>“导入”,然后选择之前导出的地形数据文件。步骤3:导出地形网格。 阅读详情

相关推荐

股票行情接口,最全的接入方法

股票行情接口一般有两种,一种是WebSocket,一种是http,通过WebSocket可以获取逐笔的股票tick数据,实时并且高效;通过http接口可以获取股票行情接口中的股票历史数据;WebSocket是一种高效的双向通信协议,它允许数据的实时推送,避免了不断的轮询请求。其次,WebSocket允许您订阅特定的数据源或股票数据产品,只接收您感兴趣的信息,提高了数据的效率和可用性。通过接入股票行情数据的HTTP接口,您可以将数据导入到自己的分析工具或系统中,进行更深入的数据分析、模型构建和决策支持。

apifinance的博客 3423

牛客国庆集训派对Day3 - F.Palindrome 回文树 后缀自动机

链接:https://www.nowcoder.com/acm/contest/203/F 来源:牛客网   题目描述 修修在蒜头送给他的奖杯上看到了一个长度为n的字符串s。 他希望从s中选择两个非空子串a,b(可以有重叠的部分),使得它们拼起来是一个回文串。 修修很快就算出了方案数,他听说你也会数数,就让你也来解决一下这个问题。两个方案不同当且仅当a,b中至少一个的长度或位置不同。 输入描...

c6376315qqso的专栏 593

CTF实战:手把手教你用Python破解转轮机加密(附完整脚本)

本文详细介绍了如何使用Python逆向破解转轮机加密,特别针对CTF比赛中的Crypto类题目。通过解析转轮机加密原理、实战Python脚本编写及调试技巧,帮助参赛者快速掌握破解方法,提升在攻防世界等CTF比赛中的解题效率。

silver的专栏 1116

AirVLA:视觉-语言-动作模型如何赋能无人机实现精准空中抓取

视觉-语言-动作模型是具身智能与机器人学习领域的核心技术,它通过融合视觉感知与自然语言理解,赋予机器人理解和执行复杂指令的能力。其原理在于利用大规模预训练的多模态模型作为通用语义理解器,将文本指令映射为具体的空间动作。这项技术的核心价值在于解决了传统机器人系统依赖大量场景特定数据、泛化能力弱的问题,为实现通用机器人操作提供了新范式。在应用场景上,它正从稳定的工业环境走向动态、复杂的真实世界,例如无人机在扰动环境下的自主作业。本文探讨的AirVLA项目,正是这一趋势的典型实践,它通过引入在线自适应模块和分层控

weixin_33826609的博客 391

TNS-12516及ORA-12516错误解决

在客户端进行sqlplus连接报错如下: ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程序 在/home/oracle/product/10.2.0/db_1/network/log/listener.log中查看到错误如下: TNS-12516: TNS:listener could not find available handler with matchin

KEL 2万+

《揭秘 BME688人工智能压力湿度温度气体传感器:气体检测的多面能手》:此文为AI自动生成

BME688 是博世推出的一款具有人工智能和集成高线性度高精度压力、湿度、温度传感器的气体传感器,专为移动和联网应用开发,尺寸紧凑且低功耗。BME688 作为一款先进的传感器,在多个领域展现出卓越的性能。它采用了坚固而紧凑的 3.0 x 3.0 x 0.9 mm³ 封装,这种小巧的尺寸使其能够轻松应用于对空间要求严格的移动设备和联网应用中。同时,低功耗的特性也使得它在能源有限的环境下能够长时间稳定运行。

zheng_ruiguo的专栏 1927

leetcode力扣刷题报告 5 Longest Palindromic Substring 最长回文子串

动态规划 leetcode解题

weixin_41147129的博客 181

Mujoco xml actuator

在MuJoCo中,actuator(执行器) 是用于定义外部力或力矩的机制,这些力或力矩可以作用于关节、肌腱或身体。执行器可以模拟各种类型的驱动器,如电机、液压缸、肌肉等。它们通过定义传输(transmission)和力生成机制(force generation)来实现对模型的控制。

m0_52113469的博客 2896

LeetCode5 最长回文子串 Longest Palindromic Substring

LeetCode5 最长回文子串 Longest Palindromic Substring 题目描述 题目地址:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/ 题目难度:中等 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 示例1: 输入: "bab...

沙码龙 323

uniapp [全端兼容] - 详细实现引入使用 Google 谷歌地图显示及搜索城市地点,提供地图标点、地址搜索、定位导航、中文显示及汉化、地图打位置标点显示、搜索框搜索功能、省市区详细经纬度数据等

uniapp,h5移动端网页,微信小程序,Android,苹果ios,app,nvue,谷歌地图,官方,谷歌官方文档,googlemap,申请key,uniApp谷歌地图,详细使用教程,无法访问,集成谷歌地图,app引入谷歌地图,选点定位,地图导航,位置搜索,城市搜索,文字地点模糊查询,地点省市区详细数据,经纬度信息,markers地图标记点,一直报错怎么办,接入google地图不显示报错,谷歌地图插件,vue3,vue2,组件,Key申请流程,谷歌key怎么申请,api文档,网站打不开,用什么插件,在u

🏆 前端领域优质创作者 1万+

基于MUSIC算法的DOA估计Matlab仿真

特别需要指出的是:通道与阵元并不是一一对应,通道是由空间的一个、几个或所有阵元合成的,当然空间某个特定的阵元可包含在不同的通道内。空间谱估计侧重于研究空间多传感器阵列所构成的处理系统对感兴趣的空间信号的多种参数进行准确估计的能力,其主要目的是估计信号的空域参数或信源位置,这也是雷达、通信、声纳等许多领域的重要任务之一。从系统框图中可以清晰的看出,估计空间相当于是对目标空间的一个重构过程,这个重构的精度由众多因素决定,如环境的复杂性、空间阵元的互耦、通道不一致、频带不一致等。

FPGA/MATLAB学习教程/源码/项目合作开发 1747

LeetCode 5. Longest Palindromic Substring 最长回文子串 C#

前言 本文介绍了 LeetCode 第 5 题 , “Longest Palindromic Substring”, 也就是 “最长回文子串” 的问题. 本文使用 C# 语言完成题目,介绍了 中心扩展法、马拉车算法 等 多种方法供大家参考。 题目 English LeetCode 5. Longest Palindromic Substring Given a string s, find th...

wf824284257的博客 751

【A2DP】规范精讲[1]: 深入解析A2DP协议的核心架构

在蓝牙技术发展的早期阶段,音频传输主要通过SCO(同步面向连接)链路实现,这种设计主要针对语音通信,音质有限且功能单一。随着人们对无线高质量音频需求的增长,​​Advanced Audio Distribution Profile (A2DP)​​ 应运而生,成为蓝牙音频传输的技术基石。

byte轻骑兵的技术小窝 1万+

【LeetCode】5. Longest Palindromic Substring 最长回文子串

【LeetCode】5. Longest Palindromic Substring 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/longest-palindromic-substring/description/ 题目描述: Given a string s, find the longest palind...

负雪明烛 7775

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

LeetCode 5. Longest Palindromic Substring (最长回文子串)

题目描述: 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。   示例1: 输入: "babad" 输出: "bab" 注意: "aba"也是一个有效答案。 示例2: 输入: "cbbd" 输出: "bb"   Accepted C++ Solution:   1. 改进的中心扩展方法: 将原字符串扩展成#a#b#c#的形式可以直接...

amoscykl的博客 537

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

LeetCode 第5题 Longest Palindromic Substring 最长回文子串

  这道题实在是很经典了,解法也很多,我只写出了暴力解法-_-||,功力不够啊,把这些解法都学会总结一下,看看是怎么一步一步优化过来的。 题目描述   给定一个子串,找出其中最长的回文子串,注意子串一定要是连续的。 题目解法 暴力解法   我的暴力解法思路很简单,从大到小枚举可能的长度(len,1)(len,1)(len,1),然后对每个长度枚举起点,然后判断枚举是否为回文串,如果是则终止枚举然后...

XiangJiaoJun_的博客 368

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【小白爬Leetcode5】最长回文子串 Longest Palindromic Substring

【小白爬Leetcode5】最长回文子串 Longest Palindromic Substring 题目Manacher算法 O(n) 题目 Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Manacher算法 O(n) Manacher算法可以在O(n) 的时间内求以每个字母为回文中心的最大回文子串的长度,然后再从这里面

weixin_41604040的博客 241

【leetcode】-5. Longest Palindromic Substring求最长回文子串

Longest Palindromic Substring题目动态规划python代码 题目 Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Example 1: Input: “babad” Output: “bab” Note: “aba” is also a valid answer. Example 2: Input:

。 331

leetcode 5. Longest Palindromic Substring(最长回文子串)

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Example 1: Input: “babad” Output: “bab” Note: “aba” is also a valid answer. Example 2: Input: “cbbd” Output: “bb” 给出一个字符串,输出其最长回文子串。 回文子串:左右

蓝羽飞鸟的博客 200

Leetcode 5.最长回文子串(Longest Palindromic Substring)

Leetcode 5.最长回文子串 1 题目描述(Leetcode题目链接)   给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。 2 题解   本题可以使用动态规划的方法,子串不是子序列,需要连续,因此可以定义DP[i][j]DP[i][j]DP[i][j]为字符i...

qq_39378221的博客 430

LeetCode 5. 最长回文子串(Longest Palindromic Substring)

LeetCode.jpg 5. 最长回文子串 5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。 示例 2: 输入: "cbbd" 输出: "bb" 切题 一、Clarification 求最长回文子串,这里有几个特殊情况...

墨1024 302

LeetCode 5. Longest Palindromic Substring 最长回文子串(Java)

题目: Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Example 1: Input: “babad” Output: “bab” Note: “aba” is also a valid answer. E...

qq_41878358的博客 282

【Leetcode-python】5.Longest Palindromic Substring(最长的回文子串)

题目:给定一个字符串s,找到它的最长的回文子串。假设s的最大长度为1000。 例:Input: "babad" Output: "bab"Note: "aba" is also a valid answer. Input: "cbbd" Output: "bb" 回文字符串就是指前后是对称的字符串。 需要考虑的特殊情况: 1.Input: ""Output: "" ;...

vita2dolce的博客 222

leetcode5. Longest Palindromic Substring最长回文子串多种解法-待补充

原题链接 题目的意思不过多的赘述,这里先给出三种解法:暴力解,马拉车,一种巧解 暴力解 写一个判断回文的函数,两重循环判断最长子串(这种方法在字符串过长时可能会栈溢出) class Solution: def longestPalindrome(self, s: 'str') -&amp;amp;gt; 'str': if len(s) &amp;amp;lt; 2: return...

weixin_42156928的博客 207

【LeetCode】5.最长回文子串 Longest Palindromic Substring

5. Longest Palindromic Substring Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Example 1: Input: "babad" Output: "bab" Note:...

doctor_oyy的博客 230

LeetCode(5) 最长回文子串 Longest Palindromic Substring

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。 示例 2: 输入: "cbbd" 输出: "bb" 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-palindromic-subs...

qq_38331894的博客 156
上一篇: LeetCode.3-最长无重复字符子串(Longest Substring Without Repeating Characters)
下一篇: 马拉车算法(Manacher's Algorithm)
程序员小川
博客等级 码龄10年 47粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值