【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));
    }
}
相关推荐
小白菜又菜8 分钟前
Leetcode 646. Maximum Length of Pair Chain
算法·leetcode·职场和发展
ヾ慈城1 小时前
【数据结构 - 二叉树】
c语言·数据结构·算法·链表
卡戎-caryon1 小时前
【项目实践】贪吃蛇
c语言·数据结构·算法
PeterClerk1 小时前
PCA算法降维代码示例
人工智能·算法·机器学习·pca
冲鸭嘟嘟可1 小时前
【数据结构】使用C语言 从零实现一个栈的数据结构
c语言·数据结构·算法
小白菜又菜2 小时前
Leetcode 516. Longest Palindromic Subsequence
算法·leetcode·职场和发展
℡☞小白☜ღ2 小时前
信号量(semaphore)
算法
IT_Beijing_BIT3 小时前
C++ 的常见算法 之一
开发语言·c++·算法
日月星辰cmc3 小时前
【算法题解】部分洛谷题解(下)
算法