【动态规划】最长回文子序列(java)

news/2024/11/7 15:25:28/

最长回文子序列

  • leetcode516. 最长回文子序列
    • 题目描述
  • 暴力递归
    • 解题思路
    • 代码演示
  • 递归 + 缓存
    • 解题思路
    • 代码演示
  • 动态规划
    • 解题思路
    • 代码演示
  • 动态规划专题

leetcode516. 最长回文子序列

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-palindromic-subsequence

题目描述

给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

示例 1:
输入:s = “bbbab”
输出:4
解释:一个可能的最长回文子序列为 “bbbb” 。

示例 2:
输入:s = “cbbd”
输出:2
解释:一个可能的最长回文子序列为 “bb” 。

提示:
1 <= s.length <= 1000
s 仅由小写英文字母组成

暴力递归

解题思路

采用指针法:
一个指针卡住左边,一个卡住右边。
递归法去比较,
base case: 入股左右指针相遇,单个字符肯定是回文,返回1.
递归状况时:
左指针和右指针字符相同,那就同时移动一位。回文长度加2.
不等时,要分左指针移动,和右指针移动两种情况,
最后我们取几种情况的最大值。

代码演示

 public static int longestPalindromeSubseq(String s) {if (s == null || s.length() == 0){return 0;}int[][] ans = new int[s.length()][s.length()];return process(s.toCharArray(),0,s.length()-1,ans);// return process(s.toCharArray(),0,s.length()-1);}/*** 递归* @param s 字符数组* @param L 左指针* @param R 右指针* @return*/public static int process(char[] s,int L,int R){//base caseif(L > R){return 0;}//base case 单个字符肯定是回文  返回1if(L == R){return 1;}int p1 = 0;int p2 = 0;int p3 = 0;//相等时 同时移动if(s[L] == s[R]){p1 = 2 + process(s,L + 1,R - 1);}else{//不等时分两种情况,最后要最大值p2 = process(s,L + 1,R);p3 = process(s,L,R - 1);}return Math.max(p1,Math.max(p2,p3));}

递归 + 缓存

解题思路

递归中有太多的重复计算,我们加到缓存中,减少计算量
要根据变量来确定如何加缓存,
变量是L 和 R ,因此用二维数组来缓存

代码演示

 public static int longestPalindromeSubseq(String s) {if (s == null || s.length() == 0){return 0;}int[][] ans = new int[s.length()][s.length()];return process(s.toCharArray(),0,s.length()-1,ans);// return process(s.toCharArray(),0,s.length()-1);}/*** 递归加 缓存* @param s 字符数组* @param L 左指针* @param R 右指针* @param dp 缓存表* @return*/public static int process(char[] s,int L,int R,int[][]dp){//base caseif(L > R){return 0;}if(L == R){return 1;}//缓存中有的话 直接缓存拿if(dp[L][R] != 0){return dp[L][R];}int p1 = 0;int p2 = 0;int p3 = 0;if(s[L] == s[R]){p1 = 2 + process(s,L + 1,R - 1,dp);}else{p2 = process(s,L + 1,R,dp);p3 = process(s,L,R - 1,dp);}int ans = Math.max(p1,Math.max(p2,p3));//结果加到缓存中dp[L][R] = ans;return ans;}

动态规划

解题思路

动态规划就是对递归j加缓存方案的改写
三个步骤
1.根据base case 去初始化缓存表,
2.把递归过程改成从递归缓存表中拿值的过程
3.返回值就是调用递归的最初始状态的值。

代码演示

 /*** 动态规划* @param s* @return*/public static int dp(String s){char[] chars = s.toCharArray();int N = chars.length;int[][] ans = new int[N][N];//base case 去初始化for (int i = 0; i < N ;i++){ans[i][i] = 1;}//根据递归过程去填值for (int i = 1;i < N ;i++){int R = i;int L = 0;while (R < N){int p1 = 0;int p2 = 0;int p3 = 0;if (chars[L] == chars[R]){p1 = 2 + ans[L + 1][R - 1];}else{p2 = ans[L + 1][R];p3 = ans[L][R - 1];}ans[L][R] = Math.max(p1,Math.max(p2,p3));L++;R++;}}//返回调用的最初始状态。return ans[0][N - 1];}

动态规划专题

leetcode1143. 最长公共子序列

leetcode.486. 预测赢家

动态规划.背包问题–填满背包的最大价格

leetcode–N 皇后 II


http://www.ppmy.cn/news/242903.html

相关文章

智能语音电话机器人怎么选?从这三方面下手

电销机器人市场鱼龙混杂&#xff0c;哪个电话机器人品牌好&#xff1f; 小编觉得可以从三个方面下手&#xff1a; 第一、核心技术 使用传统电销时需要考虑这些数据&#xff1a;接通率、通话时长、投诉、客户满意度等&#xff0c;因为它们直接影响着电销人员的业务素质&#…

你了解过“本次通话将被录音,请您谅解“背后的智能语音质检?

“为了保证通话服务质量&#xff0c;本次通话将被录音&#xff0c;请您谅解", 这句话是不是很耳熟&#xff0c;这里的电话录音就是为了方便公司监察、纪检、管理等部门能随机抽取电话录音对公司的客服或销售人员在与客户通话的过程服务态度作出评价: 比如是否按照规定话术…

手机录音 怎么单声道_手机通话小不是手机问题,打开这个开关,音量提高好几倍...

平时在打电话的时候&#xff0c;你是否有这样的困扰&#xff1f;明明都把手机通话音量调整到最大了&#xff0c;但声音却还是感觉很小的样子。在一些公共场合下&#xff0c;没有携带耳机&#xff0c;又不能将手机开通免提&#xff0c;这种情况实在是很磨人&#xff01; 其实我们…

电话机器人源码可以低成本高效率为OEM代理前景保驾护航

深圳电销机器人OEM代理前景怎么样&#xff1f;随着人工智能的发展&#xff0c;越来越多的企业开始选择采用智能语音机器人&#xff0c;来减轻人工的压力&#xff0c;更好的服务客户&#xff0c;提高效率。 而随着人工智能的发展&#xff0c;越来越多的企业开始选择采用智能语音…

SpringBoot整合第三方技术 -- SpringBoot快速入门保姆级教程(三)

文章目录 前言三、SpringBoot整合第三方技术1.SpringBoot整合junit2.Spring整合junit入门案例3.SpringBoot整合Mybatis4.SpringBoot整合Mybatis入门案例5.SpringBoot整合Mybatis更换默认数据源 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博…

高性价比TWS降噪耳机:南卡和FIIL降噪蓝牙耳机哪个更好?

近几年&#xff0c;TWS耳机凭借着真无线、无约束的优势&#xff0c;逐渐成为大家日常生活中必不可少的电子产品&#xff0c;相信在很多人的包包里都会装着一款真无线蓝牙耳机&#xff0c;无论是听音乐、看视频&#xff0c;还是玩游戏都能用到。 近两年&#xff0c;许多品牌都推…

AI智能语音电销机器人能高效取代繁杂的电话工作

AI智能语音电销机器人能高效取代繁杂的电话工作&#xff0c;目前智能客服机器人外呼系统就是老板的超级员工&#xff0c;你还在犹豫什么?无论是从成本、时间、数据、还是跟进难度上都可以看出人工智能電話机器人的明显优势。 科技革新智能化浪潮来袭&#xff0c;如智能…

钢架品牌

Colnago&#xff0c;DeRosa&#xff0c;Bianchi&#xff0c;Gios&#xff0c;Cinelli 意大利的五大自行车品牌&#xff0c;也就是所谓的一王四后。 //z 2014-12-08 12:56:09 L.23 39831 BG57IV3XCL T727794647 .K.F4064690091[T54,L3045,R97,V2257] Colnago 品牌历史&#xff…