代码随想录算法训练营day57 | 647. 回文子串,516.最长回文子序列,动态规划总结篇

news2024/12/23 18:18:21

代码随想录算法训练营day57 | 647. 回文子串,516.最长回文子序列,动态规划总结篇

  • 647. 回文子串
    • 解法一:动态规划
    • 解法二:双指针中心扩散法
  • 516.最长回文子序列
    • 解法一:动态规划
  • 动态规划总结篇
    • 动划基础
    • 背包问题系列
    • 打家劫舍系列
    • 股票系列
    • 子序列系列
    • 动规题型总结


647. 回文子串

教程视频:https://www.bilibili.com/video/BV17G4y1y7z9
在这里插入图片描述

解法一:动态规划

class Solution {
    public int countSubstrings(String s) {
        // 1、dp[i][j]含义:字符串[i, j]是否为回文子串
        // 2、递归公式:dp[i][j]=dp[i+1][j-1];
        // 3、dp初始化:为了不影响递归中的判断,所有下标均初始化为false
        // 4、遍历顺序:当前状态是由左下角状态推导出来的,外层for倒序遍历,内层for正序遍历
        // 5、打印验证。
        boolean[][] dp = new boolean[s.length()][s.length()];
        int result=0;

        for(int i=s.length()-1;i>=0;i--){
            for(int j=i;j<s.length();j++){
                if(s.charAt(i)==s.charAt(j)){
                    if(j-i<=1){
                        dp[i][j]=true;
                        result++;
                    }else{
                        dp[i][j]=dp[i+1][j-1];
                        if(dp[i][j])result++;
                    }
                }
            }
        }
        return result;
    }
}

解法二:双指针中心扩散法

遍历数组,假定每个数组为中心元素,统计回文子串。
在遍历中心点的时候,要注意中心点有两种情况。一个元素可以作为中心点,两个元素也可以作为中心点。

class Solution {
    public int countSubstrings(String s) {
        int result=0;
        for(int i=0;i<s.length();i++){
            result+=extend(s, i, i);//一个元素作为中心点
            result+=extend(s, i, i+1);//两个元素作为中心点
        }
        return result;
    }
	// 中心扩散判断回文串
    public int extend(String s, int left, int right){
        int result = 0;
        while(left>=0 && right<s.length()){
            if(s.charAt(left)==s.charAt(right)){
                result++;
            }else{
                break;// 不相等就不能再构成回文串
            }
            left--;
            right++;
        }
        return result;
    }
}

516.最长回文子序列

教程视频:https://www.bilibili.com/video/BV1d8411K7W6
在这里插入图片描述

解法一:动态规划

在这里插入图片描述
右侧初始化一条对角线代码:(利用了数组默认值为0)

class Solution {
    public int longestPalindromeSubseq(String s) {
        // 1、dp[i][j]含义:字符串[i, j]中最长回文子串长度
        // 2、递归公式:从两侧向中间依次判断
        // 3、dp初始化:指向单个字符时,长度为1,dp[i][i]=1;
        // 4、遍历顺序:当前状态是由左下角状态推导出来的,外层for倒序遍历,内层for正序遍历
        // 5、打印验证。
        int[][] dp = new int[s.length()+1][s.length()+1];

        for(int i=s.length()-1;i>=0;i--){
            dp[i][i]=1;//初始化
            for(int j=i+1;j<s.length();j++){
                if(s.charAt(i)==s.charAt(j)){//外层两个字符相等
                    //累计回文子串长度
                    dp[i][j]=dp[i+1][j-1]+2;
                }else{//外层两个字符不相等
                    //比较删左侧和删右侧那个子串长度更长,取更长的值
                    dp[i][j]=Math.max(dp[i][j], Math.max(dp[i+1][j], dp[i][j-1]));
                }
            }
        }
        return dp[0][s.length()-1];
    }
}

左侧初始化两条对角线代码:

class Solution {
    public int longestPalindromeSubseq(String s) {
        // 1、dp[i][j]含义:字符串[i, j]中最长回文子串长度
        // 2、递归公式:从两侧向中间依次判断,两侧相等时dp[i][j]=dp[i+1][j-1]+2;,两侧不等时dp[i][j]=Math.max(dp[i+1][j], dp[i][j-1]);
        // 3、dp初始化:
        /* 
           if(s.charAt(i)==s.charAt(j)){
        	    if(j-i<=1){dp[i][j]=j-i+1;}
           }else{
           		dp[i][j]=Math.max(dp[i+1][j], dp[i][j-1]);
           }
       	*/
        // 4、遍历顺序:当前状态是由左下角状态推导出来的,外层for倒序遍历,内层for正序遍历
        // 5、打印验证。
        int[][] dp = new int[s.length()][s.length()];
        int result = 0;

        for(int i=s.length()-1;i>=0;i--){
            for(int j=i;j<s.length();j++){
                if(s.charAt(i)==s.charAt(j)){//外层两个字符相等
                    if(j-i<=1){//如果遍历到中心则直接赋值(初始化)
                        dp[i][j]=j-i+1;
                    }else{//否则累计回文子串长度
                        dp[i][j]=dp[i+1][j-1]+2;
                    }
                }else{//外层两个字符不相等
                    //比较删左侧和删右侧哪个子串长度更长,取更长的值(部分初始化)
                    dp[i][j]=Math.max(dp[i+1][j], dp[i][j-1]);
                }
                result=Math.max(dp[i][j],result);
            }
        }
        return result;
    }
}

动态规划总结篇

动规五部曲分别为:
1、dp数组(dp table)以及下标的含义
2、递推公式
3、dp数组初始化
4、遍历顺序
5、举例推导dp数组

动划基础

1 代码随想录算法训练营day38 | 动态规划理论基础,509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯

2 代码随想录算法训练营day39 | 62.不同路径,63. 不同路径 II

3 代码随想录算法训练营day41 | 343. 整数拆分,96.不同的二叉搜索树

背包问题系列

1 代码随想录算法训练营day42 | 01背包问题,你该了解这些!,01背包问题,你该了解这些! 滚动数组 , 416. 分割等和子集

2 代码随想录算法训练营day43 | 1049. 最后一块石头的重量 II ,494. 目标和,474.一和零,01背包问题总结

3 代码随想录算法训练营day44 | 完全背包,518. 零钱兑换 II,377. 组合总和 Ⅳ

4 代码随想录算法训练营day45 | 70. 爬楼梯 (进阶),322. 零钱兑换,279.完全平方数

5 代码随想录算法训练营day46 | 139.单词拆分 ,多重背包,背包问题总结篇!

打家劫舍系列

代码随想录算法训练营day48 | 198.打家劫舍,213.打家劫舍II,337.打家劫舍III

股票系列

1 代码随想录算法训练营day49 | 121. 买卖股票的最佳时机,122.买卖股票的最佳时机II

2 代码随想录算法训练营day50 | 123.买卖股票的最佳时机III,188.买卖股票的最佳时机IV

3 代码随想录算法训练营day51 | 309. 最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费,股票问题总结

子序列系列

1 代码随想录算法训练营day52 | 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组

2 代码随想录算法训练营day53 | 1143.最长公共子序列,1035.不相交的线,53. 最大子序和 动态规划
3 代码随想录算法训练营day55 | 392.判断子序列,115.不同的子序列
4 代码随想录算法训练营day56 | 583. 两个字符串的删除操作,72. 编辑距离,编辑距离总结篇
5 代码随想录算法训练营day57 | 647. 回文子串,516.最长回文子序列,动态规划总结篇

动规题型总结

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/593607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全基本概念

一、什么是网络安全 &#xff08;1&#xff09;网络安全 网络安全指网络系统中的硬件、软件以及系统中的数据受到保护&#xff0c;不因偶然或恶意的原因而遭到破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。 网络安全包括&#xff1a;网络…

好程序员解析:2023年物联网的发展现状和未来趋势

物联网&#xff1a;把所有物品通过信息传感设备与互联网连接起来&#xff0c;进行信息交换&#xff0c;即物物相息&#xff0c;以实现智能化识别和管理。 物联网是新一代信息技术的重要组成部分&#xff0c;也是“信息化”时代的重要发展阶段。物联网的核心和基础仍然是互联网&…

伊利与腾讯云CODING的「水乳交融」启示录

本文转载雷锋网 “对蜡烛的不断优化&#xff0c;是不可能导致电灯发明的。” 谈数字化与创新能力&#xff0c;有时会掉进这样的误区&#xff1a;更换个别工具&#xff1d;数字化&#xff1d;创新。用蜡烛打个比方&#xff0c;常见的优化是&#xff0c;让蜡烛直径变宽更防风、变…

系统分析师:全程指导例题

1、流水线 题解&#xff1a;这里假设能并行处理&#xff0c;画流水线时空图如下&#xff1a; 这里可以看到&#xff0c;处理4个数据需要15At&#xff0c;因此实际速率是4/15At&#xff0c;流水线效率为忙碌时间与总时间对比&#xff0c;也可以看成忙碌时空区/总时空区&#xff…

C++学习之旅-入门永远的HelloWorld变量的基础

文章目录 创建文件(Hello World)注释变量的使用常量标识符命名规则数据类型整形sizeof关键字实型(浮点类型)字符型转义字符字符串类型布尔类型数据的输入加减乘除运算算数运算逻辑运算 程序流程结构选择结构循环结构 跳转语句举例(while循环break)举例(for循环contine) 跳转语句…

Eclipse教程 完结(上)

Eclipse 安装插件 查找和安装插件 Eclipse作为一个集成的IDE开发工具&#xff0c;为我们的软件开发提供了便利&#xff0c;eclipse除了自带的强大功能外&#xff0c;还支持功能丰富的插件。 我们可以通过Eclipse官方市场 (Eclipse Plugins, Bundles and Products - Eclipse …

【数据集】Cityscapes-流行的语义分割数据集

本文介绍用于智能驾驶场景的语义分割数据集Cityscapes。 1. Cityscapes数据集简介 在几个月的时间里&#xff0c;在 50 个城市的春季、夏季和秋季&#xff0c;主要是在德国&#xff0c;但也在邻近国家/地区&#xff0c;从移动车辆中获取了数十万帧。它们不是故意在恶劣的天气条…

NPM 制作命令行工具 - 入门案例

一、简介 经常通过 npm 安装 vue-cli、create-react-app 之类的命令行工具&#xff0c;那么如何简单的制作一个命令行工具呢&#xff1f;只需要几步即可&#xff01; 二、制作 创建 npm 命令行工具文件夹&#xff08;例如&#xff1a;dzm-cli&#xff09; 初始化 dzm-cli&am…

1 八皇后问题

算法 八皇后问题是在国际象棋的棋盘上放八个皇后&#xff0c;八个皇后不能互相攻击。国际象棋的皇后&#xff0c;可以横向攻击也可以纵向攻击&#xff0c;也可以斜向攻击。所以要放八个皇后&#xff0c;就必须任一直线和斜线上不能同时有两个皇后。比如以下就是一个八皇后方案&…

eslint的使用

为什么要使用eslint? ​ eslint可以帮助我们统一代码语法规范。 eslint官网: https://eslint.org/ 1.vscode中改缩进 ​ 设置->tabsize-> tab-size和vetur都改成2 ​ format->格式化->勾选format on save 2.Vscode安装Eslint插件 (1)配置Eslint插件 ​ 设…

Yandex:你不可错过的全能搜索引擎

目录 前言一、Yandex网站介绍1-1、网站介绍1-2、优势 二、Yandex网站使用技巧2-1、Yandex搜索引擎2-2、Yandex Maps2-3、Yandex Mail2-4、Yandex Games2-5、Yandex Images2-6、Yandex Video2-7、Yandex.Translate 结语 前言 andex是一家俄罗斯的互联网公司&#xff0c;成立于19…

【HarmonyOS】元服务和APP的相互跳转、相互成就

【关键字】 卡片、跳转、加桌 【背景介绍】 随着鸿蒙生态的发展&#xff0c;各种类型的应用都已经可以在Harmony OS上无差异的运行&#xff0c;面对鸿蒙新兴元服务的兴起&#xff0c;各大厂家可能都在考虑一个问题&#xff1a;如果已经有APP了&#xff0c;有必要再开发一款元…

用 JavaScript 对抗 DDOS 攻击 (下)

抗 v2 之前的那些奇技淫巧&#xff0c;纯属娱乐而已&#xff0c;并不能撑多久。 但简单、好玩&#xff0c;似乎这正是对抗的乐趣。之前从未想过&#xff0c;居然还能把脚本黑科技&#xff0c;用在网络防御上。 于是&#xff0c;又陆陆续续对抗了一段时间。 直到兴致淡却&am…

WordPress 网站管家小程序源码

正文&#xff1a; Wordpress网站管家小程序源码&#xff0c;基于uniapp开发的产品&#xff0c;WP管家是主打用户访问端&#xff0c;兼容了微信小程序与安卓APP&#xff08;其他端未测试&#xff09;&#xff0c;用于用户的访问。 1、在Wordpress根目录新建一个文件夹&#xf…

达美乐的面试(部分)(未完全解析)

Java如何保证非线程安全的数据结构&#xff08;比如HashMap&#xff09;的原子性&#xff1f;读多写少时用哪种锁好? A: 方法1&#xff1a;CAS等乐观锁机制&#xff0c;方法2&#xff1a;如果读多写少&#xff0c;可以使用读写锁&#xff08;ReentrantReadWriteLock&#xff0…

在Centos Stream 9上Docker的实操教程(二) - Docker的常用命令

在Centos Stream 9上Docker的实操教程 - Docker的常用命令 Docker启动类命令Docker镜像命令镜像列表 docker images镜像查找 docker search拉取镜像 docker pull删除镜像 docker rmi查看占用信息 docker system df容器创建新镜像 docker commit 容器命令启动容器 docker run查看…

vue组件化路由

文章目录 vue项目1.vue组件2.插槽3.自定义指令4.vue路由 vue项目 vue项目中src目录的构成 assets: 存放项目中用到的静态资源文件,例如css,图片资源等components: 存放我们封装的、可复用的组件main.js: 项目的入口文件,整个项目的运行要先执行main.jsApp.vue: 项目的根组件 …

定时器详解 -- 定时器中断、PWM输出 --stm32

STM32定时器使用 STM32定时器计数模式定时器工作原理基本定时器&#xff1a;TIM6、TIM7示例代码代码讲解 通用定时器&#xff1a;TIM2、TIM3、TIM4、TIM5高级定时器&#xff1a;TIM1、TIM8定时器PWM输出原理通用定时器3控制通道1输出PWM脉冲代码 总结参考资料 STM32定时器 STM…

加密与解密 调试篇 动态调试技术 (三)-OllyDbg 插件 Run/Hit 符号调试 加载程序

目录 插件 这里给出一个命令行插件 Run Trace 运行 Hit Trace 符号调试 符号格式 1.SYM格式 2.COFF格式 3.CodeView格式 4.PDB格式 5.DBG格式 6.MAP文件 创建调试文件 加载程序 1.CreateProcess 2.将OllyDbg附加到一个正在运行的程序上 插件 OllyDbg允许插件 …

1计算机网络体系结构_1.1计算机网络概述

1.1.1计网_概念 概念&#xff1a; 计网是一个 将【分散的、具有独立功能的】计算机系统&#xff0c;通过【通信设备与线路】连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统。简言之&#xff0c;计算机网络就是一些 互连的、自治的 计算机系统 的 集合。 …