墨风如雪博客

  • 源码小店
  • 导航站
  • 登录
  • java
  • 资源分享
让AI使用变得如此简单
  1. 首页
  2. 算法
  3. 正文

每日一道算法题:最长回文子串

2023年 5月 27日 133点热度 0人点赞 0条评论

题目介绍:

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

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

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:

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

涉及的数据结构和算法:

动态规划、中心扩展法

下面是使用动态规划和中心扩展法两种方式实现最长回文子串的

动态规划解法:

public String longestPalindrome(String s) {
    int n = s.length();
    boolean[][] dp = new boolean[n][n];
    String res = &quot;&quot;;
    for (int i = n - 1; i &gt;= 0; i--) {
        for (int j = i; j &lt; n; j++) {
            dp[i][j] = s.charAt(i) == s.charAt(j) &amp;&amp; (j - i &lt; 2 || dp[i + 1][j - 1]);
            if (dp[i][j] &amp;&amp; (res.equals(&quot;&quot;) || j - i + 1 &gt; res.length())) {
                res = s.substring(i, j + 1);
            }
        }
    }
    return res;
}

中心扩展法解法:

public String longestPalindrome(String s) {
    if (s == null || s.length() == 0) {
        return &quot;&quot;;
    }
    int start = 0, end = 0;
    for (int i = 0; i &lt; s.length(); i++) {
        int len1 = expandAroundCenter(s, i, i);
        int len2 = expandAroundCenter(s, i, i + 1);
        int len = Math.max(len1, len2);
        if (len &gt; end - start + 1) {
            start = i - (len - 1) / 2;
            end = i + len / 2;
        }
    }
    return s.substring(start, end + 1);
}

private int expandAroundCenter(String s, int left, int right) {
    while (left &gt;= 0 &amp;&amp; right &lt; s.length() &amp;&amp; s.charAt(left) == s.charAt(right)) {
        left--;
        right++;
    }
    return right - left - 1;
}

解题思路:

本题可以使用动态规划和中心扩展法两种方式来实现。

动态规划解法:

我们可以定义一个二维数组 dp,其中 dp[i][j] 表示 s 中以 i 开头、以 j 结尾的子串是否为回文子串。如果 s[i] == s[j] 且 s[i+1:j-1] 是回文串,那么s[i:j] 也是回文串。根据这个递推关系,我们可以使用动态规划来求解最长回文子串。具体地,我们从长度较短的子串开始枚举,每次枚举的时候根据已经计算好的状态来推导新的状态,最终得到最长回文子串的长度和起始位置。

中心扩展法解法:

我们可以枚举每个可能的回文中心,然后用两个指针分别向左右两边扩展,直到两个指针指向的字符不相同为止。具体地,回文中心可能是一个字符,也可能是两个字符(例如 “abba” 的中心是 “bb”),因此一共有 n + n - 1 = 2n - 1 个回文中心需要枚举,其中 n 是字符串 s 的长度。

扩展知识点:

本题中使用了动态规划和中心扩展法两种算法来解决最长回文子串的问题。在实际应用中,我们需要根据具体问题来选择不同的算法来解决问题。此外,回文串是一种非常常见的字符串特性,我们需要熟练掌握如何判断一个字符串是否为回文串,以及如何求解最长回文子串等问题。

总结:

本题使用动态规划和中心扩展法两种方式来实现最长回文子串的求解,时间复杂度分别为 O(n^2) 和 O(n^2),空间复杂度均为 O(n^2)。在实际应用中,我们需要根据具体问题来选择不同的算法来解决问题。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: java 动态规划 字符串 算法 解析
最后更新:2023年 5月 20日

墨风如雪

一个热爱生活,热爱分享的程序员

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

墨风如雪

一个热爱生活,热爱分享的程序员

最新 热点 随机
最新 热点 随机
告别机械感!OpenAudio S1让AI声音活起来 Sora触手可及!微软必应AI视频生成器,全民创作时代来临? 阿里WebAgent开源:引领自主搜索新纪元 重磅炸弹!字节跳动开源BAGEL:70亿参数,统一多模态理解与生成,AI“全能王”诞生记! 小米MiMo-VL:7B参数,怎么就成了多模态界的“越级打怪王”? 炸裂!DeepSeek 8B 量化版降临:告别显存焦虑,你的 3080 Ti 也能玩转顶级大模型了!
AI圈炸锅了!Mistral Medium 3:性能 SOTA,成本打骨折,企业玩家的新宠?字节终于开源“扣子”同款引擎了!FlowGram:AI 时代的可视化工作流利器告别“微信黑箱”!Chatlog:让你的聊天记录也能拥有“AI大脑”!字节跳动 Seed-Coder-8B:不靠人工洗数据,这80亿参数的小模型如何写出顶尖代码?85倍速的视觉革命:苹果发布 FastVLM,让你的 iPhone ‘看图说话’,快到飞起!告别AI视频“变脸怪”!腾讯混元Hunyuan Custom重磅开源,主体一致性“王炸”来了!
图像生成新篇章:OpenAI GPT-image-1 模型深度解析与应用前瞻 MariaDB开源的关系型数据库管理系统详解 Aero-1-Audio来了:1.5B参数,性能直逼SOTA,告别长音频分割烦恼 网络传输当中 五种IO模型详解 K8s常用命令和使用技巧(超详细) 只闻其声,不见其人:OpenAI的“声音魔盒”Voice Engine,15秒克隆是魔法还是潘多拉?
标签聚合
教程 deepseek java 动态规划 spring 算法 AI 设计模式

COPYRIGHT © 2023 墨风如雪博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

免责声明 - 隐私政策