算法学习day57动态规划part17-516、647
package LeetCode.DPpart17; /** * 516. 最长回文子序列 * 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 * 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 * */ public class LongestPalindromicSubsequence_516 { public int longestPalindromeSubseq(String s) { int len = s.length(); int[][] dp = new int[len + 1][len + 1]; for (int i = len - 1; i >= 0; i--) { // 从后往前遍历 保证情况不漏 dp[i][i] = 1; // 初始化 for (int j = i + 1; j < len; 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 + 1][j], Math.max(dp[i][j], dp[i][j - 1])); } } } return dp[0][len - 1]; } }
package LeetCode.DPpart17; /** * 647. 回文子串 * 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 * 回文字符串 是正着读和倒过来读一样的字符串。 * 子字符串 是字符串中的由连续字符组成的一个序列。 * 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。 * */ public class PalindromicSubstrings_647 { public int countSubstrings(String s) { char[] chars = s.toCharArray(); int len = chars.length; boolean[][] dp = new boolean[len][len]; int result = 0; for (int i = len - 1; i >= 0; i--) { for (int j = i; j < len; j++) { if (chars[i] == chars[j]) { if (j - i <= 1) { // 情况一 和 情况二 result++; dp[i][j] = true; } else if (dp[i + 1][j - 1]) { //情况三 result++; dp[i][j] = true; } } } } return result; } }
分类:
算法学习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署