动态规划-最长的回文序列

news/2024/10/29 1:23:21/

这里写自定义目录标题

  • 1 描述
  • 2 样例
    • 2.1 样例1
    • 2.2 样例2
  • 3 解题思路以及实现方法
    • 3.1 解题思路
      • 3.1.1 确定状态
      • 3.1.2 转移方程
      • 3.1.3 初始条件和边界情况
      • 3.1.4 计算顺序
    • 3.2 题解
      • 3.2.1 C++实现
      • 3.2.2 java实现

该题是lintcode上 667 · 最长的回文序列,该题的解题思路亦是参考了九章侯老师的解题思路给出。

1 描述

给一字符串 s, 找出在 s 中的最长回文子序列的长度. 你可以假设 s 的最大长度为 1000.

2 样例

2.1 样例1

输入: “bbbab”
输出: 4
解释:
一个可能的最长回文序列为 “bbbb”

2.2 样例2

输入: “bbbbb”
输出: 5

3 解题思路以及实现方法

3.1 解题思路

3.1.1 确定状态

最优策略产生最长的回文子串T,其长度为M;

  • 情况1:回文串长度为1,既只包含一个字母
  • 情况2:回文串长度大于1,则T[0] == T[M - 1]
    对于情况2,剩余部分T[1…M - 2]仍然是一个回文串

子问题:
要求s[i…j]的最长回文子串
如果s[i] == s[j],需要知道s[i + 1, j + 1]的最长回文子串,否则,答案是s[i + 1 … j]的最长回文子串或s[i, …, j - 1]的最长回文子串
状态:设f[i][j]表示为s[i … j]的最长回文子串的长度

3.1.2 转移方程

在这里插入图片描述

3.1.3 初始条件和边界情况

状态:设f[i][j]表示为s[i … j]的最长回文子串的长度
f[i][j] = max{f[i+1][j], f[i][j-1], f[i+1][j-1] + 2|S[i]=S[j]}

初始条件:

  • f[0][0] = f[1][1] = … = f[N-1][N-1] = 1
    • 一个字母,既长度为1的回文串
  • 如果s[i] == s[i + 1],f[i][i + 1] = 2
  • 如果s[i] != s[i + 1],f[i][i + 1] = 1

3.1.4 计算顺序

设f[i][j]表示为s[i … j]的最长回文子串的长度
f[i][j] = max{f[i+1][j], f[i][j-1], f[i+1][j-1] + 2|S[i]=S[j]}
区间动态规划:按照长度j - i 从小到大一次去计算。

3.2 题解

3.2.1 C++实现

class Solution {
public:/*** @param s: the maximum length of s is 1000* @return: the longest palindromic subsequence's length*/int longestPalindromeSubseq(string &s) {// write your code hereint n = s.size();if (n <= 1) {return n;}vector<vector<int>> f(n, vector<int>(n, 1));for (int i = 0; i < n - 1; i++) {f[i][i + 1] = (s[i] == s[i + 1]) ? 2 : 1;}for (int len = 3; len <= n; len++) {for (int i = 0; i <= n - len; i++) {int j = i + len - 1;f[i][j] = max(f[i + 1][j], f[i][j - 1]);if (s[i] == s[j]) {f[i][j] = max(f[i][j], f[i + 1][j - 1] + 2);}}}return f[0][n - 1];}
};

3.2.2 java实现

public class Solution {/*** @param s: the maximum length of s is 1000* @return: the longest palindromic subsequence's length*/public int longestPalindromeSubseq(String s) {// write your code herechar[] str = s.toCharArray();int n = str.length;if (n <= 1) {return n;}int[][] f = new int[n][n];for (int i = 0; i < n; i++) {f[i][i] = 1;}for (int i = 0; i < n - 1; i++) {f[i][i + 1] = (str[i] == str[i + 1]) ? 2 : 1;}for (int len = 3; len <= n; len++) {for (int i = 0; i <= n - len; i++) {int j = i + len - 1;f[i][j] = Math.max(f[i + 1][j], f[i][j - 1]);if (str[i] == str[j]) {f[i][j] = Math.max(f[i][j], f[i + 1][j - 1] + 2);}}}return f[0][n - 1];}
}

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

相关文章

退休大厂软件测试面试官给大家的一些建议

最近因为又要增加用人&#xff0c;就又开始忙于招聘&#xff0c;一段时间下来遇到不少有趣的事情&#xff0c;结合之前的面试经验&#xff0c;就简单记录一下。 火眼金睛&#xff1a;识别真假 为什么一开始要说这个&#xff0c;因为最近确实遇到很多编造的简历&#xff0c;给…

android mtp 单反 api,android读取单反的数据

上一节说过怎么去获取usb的数据&#xff0c;而项目中需要的逝去获取单反保存的照片&#xff0c;当然你可以用读卡器&#xff0c;用读卡器的话和usb的原理是一样的&#xff0c;也可以直接使用otg连接android手机 下面&#xff0c;来说下单反-->otg-->手机读取照片的实现 同…

DSLR Video Tips: Software 数码单反相机视频提示:软件 Lynda课程中文字幕

DSLR Video Tips: Software 中文字幕 数码单反相机视频提示&#xff1a;软件 中文字幕DSLR Video Tips: Software 视频制作不会停留在您的数码单反相机中 下一步创建一个有凝聚力的故事&#xff0c;并寻找您的项目发生在后期制作&#xff1a;像Premiere Pro和Final Cut Pro软…

Java实现的五子棋游戏 ~java.awtjava.swing

文章目录 Java实现的五子棋游戏1.实现效果2.实现源码2.1运行主函数main.java2.2 棋盘布局Chessboard.java3.Algorithm算法 点击下载链接&#xff1a;Java实现的五子棋游戏源码下载 Java实现的五子棋游戏 作业要求&#xff1a; &#xff08;1&#xff09;课题代号&#xff1a; …

Rust 基础语法

Rust 基础语法 变量&#xff0c;基本类型&#xff0c;函数&#xff0c;注释和控制流&#xff0c;这些几乎是每种编程语言都具有的编程概念。 这些基础概念将存在于每个 Rust 程序中&#xff0c;及早学习它们将使你以最快的速度学习 Rust 的使用。 变量 首先必须说明&#x…

YUV420笔记

YUV420 有YU12、YV12、NV12、NV21 YU12存储格式是 YU12存储格式是YU13中的UV顺序反过来 NV12存储格式是 NV21是NV12数据取反 YUV420_888 是YCbCr的泛化格式&#xff0c;不会具体指明是YU12&#xff0c;YV12&#xff0c;NV12&#xff0c;或是是NV21。它能够表示任何4:2:0的平…

(五) ElasticSearch 数据类型和文档CRUD操作

1.ES数据类型 官方文档地址&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html#_complex_datatypes 核心数据类型&#xff08;Core Data Types&#xff09;&#xff1a; 核心数据类型是 Elasticsearch 最基本和常用的数据类型…

PMP证书能直接升级项目管理专业人员能力评价(CSPM)三级吗?

2021年10月&#xff0c;中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系&#xff0c;开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会&#xff08;CAS&#xff09;组织开展的项…