【Leetcode 5】最长回文字串 —— 动态规划

简介: 我们可以使用动态规划解决本题,解题思路:1. 状态定义:`dp[l][r]`表示起点为i,终点为j的字串是否回文串2. 状态转移方程:`dp[l][r] = dp[l + 1][r - 1] && char[l] == char[r]`,即dp[l + 1][r - 1]为回文串且i和j的字符相同

5. 最长回文字串

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

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

示例 1:

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

示例 2:

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

题目分析

经典动态规划问题,更多案例可见 Leetcode 动态规划详解

我们可以使用动态规划解决本题,解题思路:

  1. 状态定义:dp[l][r]表示起点为i,终点为j的字串是否回文串
  2. 状态转移方程:dp[l][r] = dp[l + 1][r - 1] && char[l] == char[r],即dp[l + 1][r - 1]为回文串且i和j的字符相同

动态规划一般用于求解具有重叠子问题和最优子结构的问题,例如最长公共子序列、背包问题、最短路径等。重叠子问题指的是在求解问题的过程中,多次用到相同的子问题,最优子结构指的是问题的最优解可以通过子问题的最优解来构造

class Solution {
   
   
    /**
     * 状态转移方程:dp[l][r] = dp[l + 1][r - 1] && char[l] == char[r]
     * @param s
     * @return
     */
    public String longestPalindrome(String s) {
   
   
        if (s == null || s.length() < 2) {
   
   
            return s;
        }
        int n = s.length();
        //最长回文串的起点、终点和长度
        int maxStart = 0, maxEnd = 0, maxLen = 1;
        boolean[][] dp = new boolean[n][n];
        for (int r = 1; r < n; r++) {
   
   
            for (int l = 0; l < r; l++) {
   
   
                if (s.charAt(l) == s.charAt(r) && (r - l <= 2 || dp[l + 1][r - 1])) {
   
   
                    dp[l][r] = true;
                    if (r - l + 1 > maxLen) {
   
   
                        maxLen = r - l + 1;
                        maxStart = l;
                        maxEnd = r;
                    }
                }
            }
        }
        return s.substring(maxStart, maxEnd + 1);
    }
}
相关文章
|
5月前
|
机器学习/深度学习 存储 算法
LeetCode 题目 95:从递归到动态规划实现 不同的二叉搜索树 II
LeetCode 题目 95:从递归到动态规划实现 不同的二叉搜索树 II
|
5月前
|
缓存
力扣每日一题 6/14 动态规划+数组
力扣每日一题 6/14 动态规划+数组
38 1
|
5月前
|
算法 数据挖掘 开发者
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】
|
5月前
|
存储 算法 数据可视化
深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)
深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)
|
5月前
|
存储 算法 数据可视化
LeetCode 题目 96:从动态规划、递归到卡塔兰数实现不同的二叉搜索树
LeetCode 题目 96:从动态规划、递归到卡塔兰数实现不同的二叉搜索树
|
5月前
|
存储 算法 数据可视化
LeetCode 132题详解:使用动态规划与中心扩展法解决分割回文串 II 的最少分割次数问题
LeetCode 132题详解:使用动态规划与中心扩展法解决分割回文串 II 的最少分割次数问题
|
5月前
|
存储 算法 数据可视化
LeetCode 131题详解:高效分割回文串的递归与动态规划方法
LeetCode 131题详解:高效分割回文串的递归与动态规划方法
|
5月前
|
存储 SQL 算法
优化解码方法:记忆化搜索和空间优化动态规划的实用指南 【LeetCode 题目 91】
优化解码方法:记忆化搜索和空间优化动态规划的实用指南 【LeetCode 题目 91】
|
5月前
|
算法 索引
力扣每日一题 6/28 动态规划/数组
力扣每日一题 6/28 动态规划/数组
52 0
|
5月前
|
存储
力扣每日一题 6/19 排序+动态规划
力扣每日一题 6/19 排序+动态规划
30 0