【CT】LeetCode手撕—5. 最长回文子串

目录

  • 题目
  • 1-思路
  • [2- 实现](#2- 实现)
    • [⭐5. 最长回文子串------题解思路](#⭐5. 最长回文子串——题解思路)
  • [3- ACM实现](#3- ACM实现)

题目


1-思路

  • 子串的定义:子串是原始字符串的一个连续部分
  • 子序列的定义:子序列是原始字符串的一个子集
  • 记录最长回文子串的起始位置以及其长度,最终通过下标截取

动规五部曲

  • 1.定义 dp 数组
    • boolean dp[i][j] 代表区间在 [i,j] 的子串是否是回文
  • 2.递推公式
    • nums[i] == nums[j] 的前提下
    • ① 当 j-1 - (i+1) +1 <2 时,也就是 区间严格小于 2 的时候 j-i<3dp[i+1][j-1] = true
    • ② 否则 dp[i][j] = dp[i+1][j-1]
  • 3.初始化
    • 单个字符一定是回文串dp[i][i] = true
  • 4. 遍历
    • 在得到一个 dp[i][j]true 时,就记录字符串的起始位置和长度
    • 由于 dp[i][j] 从左下角的位置推导来,因此遍历的方式以列遍历,先遍历列再遍历行
    • 由递推公式可以得到,dp[i][j] 由左下角的元素推导而来,因此 i 的遍历顺序是从 s.length() 开始遍历

2- 实现

⭐5. 最长回文子串------题解思路

java 复制代码
class Solution {
    public String longestPalindrome(String s) {
        if(s.length()<2){
            return s;
        }

        int maxLen = 1;
        int begin = 0;

        //1. 定义 dp数组
        // dp[i][j] 代表区间[i,j]内的子串是否回文
        boolean[][] dp = new boolean[s.length()][s.length()];


        // 2.递推公式
        // if(s.charAt(i)==s.charAt(j)) {dp[i][j] = dp[i+1][j-1];}

        // 3.初始化
        // dp[i][i] = true;
        for(int i = 0 ; i < s.length();i++){
            dp[i][i] = true;
        }

        // 4.遍历顺序
        for(int i = s.length()-1 ; i >= 0 ;i--){
            for(int j = 0 ; j < s.length();j++ ){
                if(s.charAt(i) == s.charAt(j)){
                    // 单个字符 没意义
                    if(j-i<3){
                        dp[i][j] = true;
                    }else{
                        dp[i][j] = dp[i+1][j-1];
                    }
                }

                // 只要 dp[i][j] == true 成立,就表示 子串[i..j] 回文,此时记录长度和起始位置
                if(dp[i][j] && j-i+1>maxLen){
                    maxLen = j-i+1;
                    begin = i;
                }
            }
        }
        return s.substring(begin,begin+maxLen);
    }
}

3- ACM实现

java 复制代码
public class maxPlaindrome {

    public static String maxPlaindrome(String str){
        int maxLen = 1;
        int begin = 0;
        int len = str.length();
        if(len<2){
            return str;
        }

        //1.定义dp
        boolean[][] dp = new boolean[len][len];

        //2.递推
        // if(s.charAt(i) == s.charAt(j)){ if(j-i>3){dp[i][j]=true;}else{dp[i][j] =dp[i+1][j-1];}}

        // 初始化
        for(int i = 0 ; i < len;i++){
            dp[i][i] = true;
        }

        // 4.遍历
        for(int i = len-1;i>=0;i--){
            for(int j = 1;j<len;j++){
                if(str.charAt(i) == str.charAt(j)){
                    if(j-i<3){
                        dp[i][j] = true;
                    }else{
                        dp[i][j] = dp[i+1][j-1];
                    }
                }
                if(dp[i][j] && j-i+1>maxLen){
                    maxLen = j-i+1;
                    begin =i;
                }
            }
        }
        return str.substring(begin,begin+maxLen);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入字符串");
        String str = sc.nextLine();
        System.out.println("最长回文子串为"+maxPlaindrome(str));
    }
}
相关推荐
王老师青少年编程3 小时前
gesp(C++五级)(14)洛谷:B4071:[GESP202412 五级] 武器强化
开发语言·c++·算法·gesp·csp·信奥赛
DogDaoDao3 小时前
leetcode 面试经典 150 题:有效的括号
c++·算法·leetcode·面试··stack·有效的括号
Coovally AI模型快速验证4 小时前
MMYOLO:打破单一模式限制,多模态目标检测的革命性突破!
人工智能·算法·yolo·目标检测·机器学习·计算机视觉·目标跟踪
可为测控4 小时前
图像处理基础(4):高斯滤波器详解
人工智能·算法·计算机视觉
Milk夜雨5 小时前
头歌实训作业 算法设计与分析-贪心算法(第3关:活动安排问题)
算法·贪心算法
BoBoo文睡不醒5 小时前
动态规划(DP)(细致讲解+例题分析)
算法·动态规划
apz_end6 小时前
埃氏算法C++实现: 快速输出质数( 素数 )
开发语言·c++·算法·埃氏算法
仟濹6 小时前
【贪心算法】洛谷P1106 - 删数问题
c语言·c++·算法·贪心算法
银河梦想家7 小时前
【Day23 LeetCode】贪心算法题
leetcode·贪心算法
CM莫问7 小时前
python实战(十五)——中文手写体数字图像CNN分类
人工智能·python·深度学习·算法·cnn·图像分类·手写体识别