前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >最长回文子串(动态规划)

最长回文子串(动态规划)

作者头像
酒楼
发布于 2023-12-30 00:07:43
发布于 2023-12-30 00:07:43
13700
代码可运行
举报
文章被收录于专栏:酒楼酒楼
运行总次数:0
代码可运行

最长回文子串

一,题目

给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:s = "cbbd"
输出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

二,我的解法(暴力解法)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
    public String longestPalindrome(String inputStr) {
        String result = inputStr.substring(0, 1);
        String aimStr = "";
        int tail = 0;
        int head = 0;
        int length = inputStr.length();

        if (inputStr != null && !inputStr.isEmpty()) {
            // String[] nums = buildNums(inputStr);
            for (int i = 0; i < length; i++) {
                tail = i + 1;
                head = i;
                if (head > 0 && tail < length && inputStr.charAt(head - 1) == (inputStr.charAt(tail))) {
                    head--;
                    while (head >= 0 && tail < length && inputStr.charAt(head) == (inputStr.charAt(tail))) {
                        head--;
                        tail++;
                    }
                }
                System.out.println("head: " + head + 1);
                System.out.println("tail: " + tail);
                aimStr = inputStr.substring(head + 1, tail);
                if (aimStr.length() > result.length()) {
                    result = aimStr;
                }
                tail = i + 1;
                head = i;
                while (head >= 0 && tail < length && inputStr.charAt(head) == (inputStr.charAt(tail))) {
                    head--;
                    tail++;
                }
                System.out.println("head: " + head + 1);
                System.out.println("tail: " + tail);
                aimStr = inputStr.substring(head + 1, tail);
                if (aimStr.length() > result.length()) {
                    result = aimStr;
                }

            }
        }

        return result;
    }
}

三,官方解法(动态规划)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Solution{
    public String longestPalindrome(String s){
        int len = s.length();
        if(len < 2){
            return s;
        }
        
        int maxLen = 1;
        int begin = 0;
        // dp[i][j] 表示 s[i..j] 是否是回文串
        boolean[][] dp = new boolean[len][len];
        // 初始化:所有长度为1的字串都是回文串
        for(int i=0;i<len;i++){
            dp[i][i] = true;
        }
        
        char[] charArray = s.toCharArray();
        //递推开始
        //先枚举子串长度
        for(int L = 2;L<=len;L++){
            //枚举左边界,左边界的上限设置可以宽松一些
            for(int i = 0 ;i<len;i++){
                //由 L 和i可以确定有边界,即 j-i+1=L得
                int j = L + i -1;
                //如果右边界越界,就可以退出当前循环
                if(j >= len){
                    break;
                }
                
                if(charArray[i] != charArray[j]){
                    dp[i][j] = false;
                }else{
                    if(j-i<3){
                        dp[i][j] = true;
                    }else{
                        dp[i][j] = dp[i+1][j-1];
                    }
                }
                
                //只要 dp[i][L] == true 成立,就表示子串 s[i..L] 是回文,此时记录回文长度和起始位置
                if(dp[i][j] && j-i+1>maxLen){
                    maxLen = j-i+1;
                    begin = i;
                }
            }
        }
        return s.substring(begin,begin+maxLen);
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
005. 最长回文子串 | Leetcode题解
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
苏南
2020/12/16
4460
005. 最长回文子串 | Leetcode题解
LeetCode-5-最长回文字串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
benym
2022/07/14
1740
lc5最长回文子串「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/163997.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/15
2040
lc5最长回文子串「建议收藏」
多种思路秒杀经典面试题最长回文子串
大家好,我是程序员小熊,来自大厂的程序猿。最长回文子串是面试中常考的题目,尤其是一些互联网大厂,像亚马逊、微软、脸书、字节和腾讯等都考过这道题。
程序员小熊
2021/05/28
6310
多种思路秒杀经典面试题最长回文子串
多种思路深度剖析经典面试题---最长回文子串
大家好,我是程序员小熊,来自大厂的程序猿。最长回文子串是面试中常考的题目,尤其是一些互联网大厂,像亚马逊、微软、脸书、字节和腾讯等都考过这道题。
程序员小熊
2021/05/17
6540
多种思路深度剖析经典面试题---最长回文子串
LeetCode - 最长回文子串
同样是三年前做的一道题目,很经典的字符串领域的算法题,求字符串的最长回文子串,当时我也是提交了好几次,并且看了相关的资料以后,才成功通过。
晓痴
2019/07/24
6740
LeetCode - 最长回文子串
Leetcode算法系列| 5. 最长回文子串
游戏开发小Y
2024/01/18
1460
Leetcode算法系列| 5. 最长回文子串
LeetCode 5. 最长回文子串(动态规划)
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
Michael阿明
2020/07/13
5480
LeetCode 5. Longest Palindromic Substring 最长回文子串 Python 四种解法(Manacher 动态规划)
通过枚举字符串子串的中心而不是起点,向两边同时扩散,依然是逐一判断子串的回文性。这种优化算法比之前第一种算法在最坏的情况下(即只有一种字符的字符串)效率会有很大程度的上升。
大鹅
2021/06/15
7040
LeetCode 5. Longest Palindromic Substring 最长回文子串 Python 四种解法(Manacher 动态规划)
最长回文子串 -- 三种解答
链接:https://leetcode-cn.com/problems/longest-palindromic-substring,著作权归领扣网络所有。
秦怀杂货店
2021/10/08
2930
图解LeetCode——5. 最长回文子串(难度:中等)
因为本题是寻找最长回文字符串,所以,我们可以采取确定中心点之后,向两侧扩展的方式,来判断“扫描”到的子串是不是回文,如果是,则继续向两侧“扩展”,直到不满足回文条件为止。假设我们找到了一个回文字符串,其字符数存在两种情况,即:“奇数”字符个数和“偶数”字符个数。
爪哇缪斯
2023/05/10
2690
图解LeetCode——5. 最长回文子串(难度:中等)
Go算法实战 - 5.【最长回文子串LeetCode-5】
原题链接 https://leetcode-cn.com/problems/longest-palindromic-substring/
junedayday
2021/08/05
3300
Leetcode 5: 最长回文子串
另外的一个想法是,既然要判断最长的回文子串,那首先要回文。要回文,首先要相等。因此先跑一遍,用字典记录下所有字符以及其相等的位置。(已知字符仅包括数字和英文字母)
千灵域
2022/06/17
2130
LeetCode 最长回文子串(动态规划)
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
SakuraTears
2022/01/13
8420
5. 最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。 示例 1: 输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。 中心扩散法 用dp做缓存 class Solution { public String longestPalindrome(String s) { /** 采用中心扩散法 不断看 left right 如果 dp[l][r
CaesarChang张旭
2021/06/01
2830
LeetCode【5】-- 最长回文子串(3种解法)
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-palindromic-substring,著作权归领扣网络所有。
秦怀杂货店
2022/02/15
2780
LeetCode【5】-- 最长回文子串(3种解法)
LeetCode 0005. 最长回文子串[动态规划详解]
本题可以使用动态规划来做,但是直接遍历每个字符串/每两个字符串空隙,向左右延展求最长回文子串也是可以的,思路比较暴力直接,详情见代码 1。
Yano_nankai
2021/03/02
3840
LeetCode 0005. 最长回文子串[动态规划详解]
每日三题-最长回文子串、搜索二维矩阵II、最长递增子序列
👨‍💻个人主页: 才疏学浅的木子 🙇‍♂️ 本人也在学习阶段如若发现问题,请告知非常感谢 🙇‍♂️ 📒 本文来自专栏: 算法 🌈 算法类型:Hot100题 🌈 ❤️ 支持我:👍点赞 🌹收藏 🤟关注 每日三题 最长回文子串 搜索二维矩阵II 最长递增子序列 最长回文子串 解法一 dp class Solution { public String longestPalindrome(String s) { char[] c = s.toCharArray()
才疏学浅的木子
2022/11/28
2280
每日三题-最长回文子串、搜索二维矩阵II、最长递增子序列
[c/c++]——最长回文子串「建议收藏」
已经很久没有更新关于leetcode的题解了,一个是觉得太费时间,二一个目前网上也有很全面的解答,但是在写leetcode的最长回文子串时,发现很多同学的代码都很长(实际上几行就可以解决的事情),并且c++解答的代码不够完整。最关键的是在一种“马拉车”的算法卡了很久很久,今天把几种求解的方法全部都整理出来,方便大家也便于自己以后复习。
全栈程序员站长
2022/08/15
3990
[c/c++]——最长回文子串「建议收藏」
【力扣刷题】5. 最长回文子串
根据回文串的定义,正着和反着读一样,那我们是不是把原来的字符串倒置了,然后找最长的公共子串就可以了。例如 S = "caba" ,S = "abac",最长公共子串是 "aba",所以原字符串的最长回文串就是 "aba"。
jayjay
2022/11/02
2230
【力扣刷题】5. 最长回文子串
推荐阅读
相关推荐
005. 最长回文子串 | Leetcode题解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文