当前位置: 首页 > news >正文

(动态规划)5. 最长回文子串 java解决

题目描述:

给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
    输入:s = "babad"
    输出:"bab"
    解释:"aba" 同样是符合题意的答案。
示例 2:
    输入:s = "cbbd"
    输出:"bb"
提示:
    1 <= s.length <= 1000
    s 仅由数字和英文字母组成

思路与算法讲解(截图来源力扣官方):

代码:

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);
    }
}

复杂度分析:

        时间复杂度:O(n^2),其中 nn 是字符串的长度。动态规划的状态总数为 O(n^2),对于每个状态,我们需要转移的时间为 O(1)。

        空间复杂度:O(n^2),即存储动态规划状态需要的空间。

相关文章:

  • styleSwin的各种bug
  • 2022.8.30 OpenCV 课程作业
  • 入选2022年BookAuthority 的最佳量子计算新书:《与量子比特共舞》
  • python实战故障诊断之CWRU数据集(四):线性回归模型的应用
  • 2022.8.30 go语言课程作业
  • CogView整体图解
  • WMI图形化查询工具
  • CogView中网络结构的总体构建
  • 25k的自动化测试面试题,原来都是这样~
  • 猿创征文|我的焚膏继晷之路
  • Linux (Ubuntu)磁盘管理与文件压缩解压(入门必看)
  • CentOS上安装Docker
  • 一文搞定IDEA中SpringBoot项目环境的热部署
  • Java运算符
  • HIS -- 医院信息管理系统业务流程
  • canvas 绘制双线技巧
  • ES学习笔记(12)--Symbol
  • FineReport中如何实现自动滚屏效果
  • JS变量作用域
  • js面向对象
  • Magento 1.x 中文订单打印乱码
  • nginx 负载服务器优化
  • Python - 闭包Closure
  • QQ浏览器x5内核的兼容性问题
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • socket.io+express实现聊天室的思考(三)
  • SpiderData 2019年2月16日 DApp数据排行榜
  • webgl (原生)基础入门指南【一】
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 力扣(LeetCode)22
  • 悄悄地说一个bug
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 异常机制详解
  • 鱼骨图 - 如何绘制?
  • ​flutter 代码混淆
  • ###项目技术发展史
  • $.ajax,axios,fetch三种ajax请求的区别
  • $GOPATH/go.mod exists but should not goland
  • (C语言)二分查找 超详细
  • (MATLAB)第五章-矩阵运算
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • .net 反编译_.net反编译的相关问题
  • .NET 命令行参数包含应用程序路径吗?
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET连接MongoDB数据库实例教程
  • @RequestBody与@ModelAttribute
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [100天算法】-不同路径 III(day 73)
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [Avalon] Avalon中的Conditional Formatting.
  • [C++基础]-入门知识
  • [CF407E]k-d-sequence
  • [EFI]Acer Aspire A515-54g电脑 Hackintosh 黑苹果efi引导文件