当前位置: 首页 > article >正文

每日OJ题_牛客_最长回文子序列_区间DP_C++_Java

目录

牛客_最长回文子序列_区间DP

题目解析

C++代码

Java代码


牛客_最长回文子序列_区间DP

最长回文子序列_牛客题霸_牛客网 (nowcoder.com)

描述:

给定一个字符串,找到其中最长的回文子序列,并返回该序列的长度。

注:回文序列是指这个序列无论从左读还是从右读都是一样的。

本题中子序列字符串任意位置删除k(len(s)>=k>=0)个字符后留下的子串。


题目解析

基础的区间 dp 问题:

  • 状态表示: dp[i][j] 表示:字符串 [i, j] 范围内的最长回文子序列的长度;
  • 状态转移方程:
  • i == j 的时候,只有⼀个字符,长度为 1;
  • i < j 的时候,分情况讨论:
  • s[i] == s[j]dp[i][j] = dp[i + 1][j - 1];
  • s[i] != s[j]dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
  • 返回值: dp[0][n - 1]

C++代码

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    string str;
    cin >> str;
    int n = str.size();
    vector<vector<int>> dp(n, vector<int>(n));
    // dp[i][j] 表示i到j区间的最长回文子序列
    for(int i = n - 1; i >= 0; --i)
    {
        dp[i][i] = 1;
        for(int j = i + 1; j < n; ++j)
        {
            if(str[i] == str[j])
                dp[i][j] = dp[i + 1][j - 1] + 2;
            else
                dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
        }
    }
    cout << dp[0][n - 1];
    return 0;
}

Java代码

import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main
{
    public static void main(String[] args) 
    {
        Scanner in = new Scanner(System.in);
        char[] s = in.next().toCharArray();
        int n = s.length;
        int[][] dp = new int[n][n];
        for(int i = n - 1; i >= 0; i--)
        {
            dp[i][i] = 1;
            for(int j = i + 1; j < n; j++)
            {
                if(s[i] == s[j])
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                else
                    dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
            }
        }
        System.out.println(dp[0][n - 1]);
    }
}

http://www.kler.cn/news/357068.html

相关文章:

  • 腾讯云宝塔面板前后端项目发版
  • pyflink 时序异常检测——EWMA
  • 双链表(数据结构)——C语言
  • Git绑定Gitee或Github以及Git面试常见题
  • 100 种下划线 / 覆盖层动画 | 终极 CSS(层叠样式表)集合
  • MySQL的并行复制原理
  • 智能家居的“眼睛”:计算机视觉如何让家更智能
  • 【C++刷题】力扣-#88-合并两个有序数组
  • 光盘刻录大文件时分卷操作
  • C#中反射基础与应用
  • vueuse的常用方法记录
  • AI 视频工具合集
  • Python无监督学习中的聚类:K均值与层次聚类实现详解
  • 1.Node.js环境搭建(windows)
  • Python基础:20、Python基础综合案例
  • 如何使用python网络爬虫批量获取公共资源数据?
  • 六、存储过程和触发器及视图和临时表
  • 低代码模式即将下线;工作流上线消息节点、支持配置卡片样式
  • 计算机组成原理之磁盘存储器
  • 【分布式微服务云原生】《Redis 的高效之道:线程模型、IO 模型与 Reactor 模型全解析》