牛客NC92 最长公共子序列(二)【中等 动态规划 Java,Go,PHP】

题目

在这里插入图片描述
题目链接:
https://www.nowcoder.com/practice/6d29638c85bb4ffd80c020fe244baf11

思路

https://blog.csdn.net/qq_36544411/article/details/120021203
思路
动态规划法,
我们以dp[i][j]表示在s1中以第i个元素结尾,s2中以第j个元素结尾的字符串的最长公共子序列长度,
若是i与j相等,则该问题可以变成1+dp[i−1][j−1],即最长公共子序列长度加1,若是不相等,
则换成两个子问题:dp[i][j−1]或者dp[i−1][j],由此用递归或者动态规划即可以解决。求出递归公式,为if s1.charAt(i-1) == s2.charAt(j-1)  dp[i][j]=dp[i-1][j-1]+1else  dp[i][j]= Math.max(dp[i-1][j],dp[i][j-1])反推求出子序列。只需要求其中一个。

参考答案Java

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** longest common subsequence* @param s1 string字符串 the string* @param s2 string字符串 the string* @return string字符串*/public String LCS (String s1, String s2) {/*https://blog.csdn.net/qq_36544411/article/details/120021203思路动态规划法,我们以dp[i][j]表示在s1中以第i个元素结尾,s2中以第j个元素结尾的字符串的最长公共子序列长度,若是i与j相等,则该问题可以变成1+dp[i−1][j−1],即最长公共子序列长度加1,若是不相等,则换成两个子问题:dp[i][j−1]或者dp[i−1][j],由此用递归或者动态规划即可以解决。求出递归公式,为if s1.charAt(i-1) == s2.charAt(j-1)  dp[i][j]=dp[i-1][j-1]+1else  dp[i][j]= Math.max(dp[i-1][j],dp[i][j-1])反推求出子序列。只需要求其中一个。*/int n = s1.length();int m = s2.length();int[][] dp = new int[n + 1][m + 1];for (int i = 0; i <= n ; i++) {for (int j = 0; j <= m ; j++) {if (i == 0 || j == 0) {dp[i][j] = 0;} else {if (s1.charAt(i - 1) == s2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1] + 1;} else {dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);}}}}Stack<Character> stack = new Stack<>();while (n > 0 && m > 0) {if (s1.charAt(n - 1) == s2.charAt(m - 1)) {stack.add(s1.charAt(n - 1));n--;m--;} else if (dp[n - 1][m] >= dp[n][m - 1]) {n--;} else {m--;}}StringBuilder sb = new StringBuilder();while (!stack.isEmpty()) {sb.append(stack.pop());}return sb.length() == 0 ? "-1" : sb.toString();}
}

参考答案Go

package mainimport "fmt"/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** longest common subsequence* @param s1 string字符串 the string* @param s2 string字符串 the string* @return string字符串*/
func LCS(s1 string, s2 string) string {/*https://blog.csdn.net/qq_36544411/article/details/120021203思路动态规划法,我们以dp[i][j]表示在s1中以第i个元素结尾,s2中以第j个元素结尾的字符串的最长公共子序列长度,若是i与j相等,则该问题可以变成1+dp[i−1][j−1],即最长公共子序列长度加1,若是不相等,则换成两个子问题:dp[i][j−1]或者dp[i−1][j],由此用递归或者动态规划即可以解决。求出递归公式,为if s1.charAt(i-1) == s2.charAt(j-1)  dp[i][j]=dp[i-1][j-1]+1else  dp[i][j]= Math.max(dp[i-1][j],dp[i][j-1])反推求出子序列。只需要求其中一个。*/n := len(s1)m := len(s2)dp := make([][]int, n+1)for i := 0; i <= n; i++ {dp[i] = make([]int, m+1)}for i := 0; i <= n; i++ {for j := 0; j <= m; j++ {if i == 0 || j == 0 {dp[i][j] = 0} else {if s1[i-1] == s2[j-1] {dp[i][j] = dp[i-1][j-1] + 1} else {cur1 := dp[i-1][j]cur2 := dp[i][j-1]if cur1 > cur2 {dp[i][j] = cur1} else {dp[i][j] = cur2}}}}}stack := []byte{}for n > 0 && m > 0 {if s1[n-1] == s2[m-1] {stack = append(stack, s1[n-1])n--m--} else if dp[n-1][m] >= dp[n][m-1] {n--} else {m--}}s3 := ""for k := len(stack) - 1; k >= 0; k-- {s3 = fmt.Sprintf("%s%s", s3, string(stack[k]))}if len(s3) == 0 {return "-1"} else {return s3}
}

参考答案PHP

<?php/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** longest common subsequence* @param s1 string字符串 the string* @param s2 string字符串 the string* @return string字符串*/
function LCS( $s1 ,  $s2 )
{/*https://blog.csdn.net/qq_36544411/article/details/120021203思路动态规划法,我们以dp[i][j]表示在s1中以第i个元素结尾,s2中以第j个元素结尾的字符串的最长公共子序列长度,若是i与j相等,则该问题可以变成1+dp[i−1][j−1],即最长公共子序列长度加1,若是不相等,则换成两个子问题:dp[i][j−1]或者dp[i−1][j],由此用递归或者动态规划即可以解决。求出递归公式,为if s1.charAt(i-1) == s2.charAt(j-1)  dp[i][j]=dp[i-1][j-1]+1else  dp[i][j]= Math.max(dp[i-1][j],dp[i][j-1])反推求出子序列。只需要求其中一个。*/$n=strlen($s1);$m= strlen($s2);$dp=array();for($i=0;$i<=$n;$i++){for($j=0;$j<=$m;$j++){if($i==0 || $j==0){$dp[$i][$j]=0;}else{if($s1[$i-1] == $s2[$j-1]){$dp[$i][$j]=$dp[$i-1][$j-1]+1;}else{$cur1= $dp[$i-1][$j];$cur2 = $dp[$i][$j-1];if($cur1>$cur2){$dp[$i][$j] = $cur1;}else{$dp[$i][$j] = $cur2;}}}}}$stack = array();$idx=0;while ($n>0 && $m>0){if($s1[$n-1] == $s2[$m-1]){$stack[$idx++] = $s1[$n-1];$n--;$m--;}else if($dp[$n-1][$m]>= $dp[$n][$m-1]){$n--;}else{$m--;}}if($idx==0) return "-1";$s3="";for(--$idx;$idx>=0;$idx--){$s3.=$stack[$idx];}return $s3;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网页布局案例 浮动

这里主要讲浮动 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>*{padding: 0;margin: 0;}.header{height: 40px;background-color: #333;}.nav{width: 1226px;heig…

(更新)中国农村经营管理统计年报 2015-2022

时间跨度&#xff1a;2015-2022年数据范围&#xff1a;全国各个省市自治区&#xff08;不含港澳台&#xff09;数据说明&#xff1a;《中国农村经营管理统计年报》根据农村经营管理情况统计报表调查数据和分析报告编写而成。系统收录了全国各省份当年农村经营管理各项数据&…

了解XSS和CSRF攻击与防御

什么是XSS攻击 XSS&#xff08;Cross-Site Scripting&#xff0c;跨站脚本攻击&#xff09;是一种常见的网络安全漏洞&#xff0c;它允许攻击者在受害者的浏览器上执行恶意脚本。这种攻击通常发生在 web 应用程序中&#xff0c;攻击者通过注入恶意脚本来利用用户对网站的信任&…

微信小程序如何进行npm导入组件

文章目录 目录 文章目录 前言 一、安装node 二、微信小程序通过npm安装组件&#xff08;以Vant-weapp为例&#xff09; 一、Vant-weapp下载 二 、修改 app.json 三 、修改 project.config.json 四 、 构建 npm 包 前言 微信小程序使用npm导入有很多的教程&#xff0c;我…

webGIS 之 智慧校园案例

1.引入资源创建地图 //index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&qu…

Java 中的单例模式

引言&#xff1a; 在 Java 编程中&#xff0c;单例模式是一种常见的设计模式&#xff0c;它保证一个类只能创建一个实例&#xff0c;并提供一个全局访问点。单例模式在很多场景下都非常有用&#xff0c;比如线程池、日志系统、数据库连接池等。本文将详细介绍 Java 中单例模式的…

百度资源平台链接提交

百度资源平台是百度搜索引擎提供的一个重要工具&#xff0c;用于帮助网站主将自己的网站链接提交给百度搜索引擎&#xff0c;以便更快地被收录和展示在搜索结果中。以下将就百度资源平台链接提交的概念、操作方法以及其对网站收录和曝光的影响进行探讨&#xff1a; 什么是百度资…

字符串(java)

字符串的特点&#xff1a; 1&#xff0e;String是java定义好的一个类&#xff0c;定义在java.lang包里面&#xff0c;所以使用的时候是不需要进行导包的 2.java程序中的所有字符串文字&#xff0c;都被实为此类的对象。也就是说当我们就算是进行赋值&#xff0c;这个也会创造…

【MATLAB源码-第173期】基于matlab的RS编码的2FSK通信系统误码率仿真,通过AWGN信道输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 通信系统的基本框架 在现代通信系统中&#xff0c;数据的传输通常涉及四个基本步骤&#xff1a;源编码、信道编码、调制和传输。源编码主要负责压缩数据&#xff0c;减少传输的数据量。信道编码则通过添加冗余信息来提高传输…

【Laravel】06 数据库迁移工具migration

【Laravel】06 数据库迁移工具migration 1.migration文件目录2. 举例 1.migration文件目录 2. 举例 (base) ➜ example-app php artisan migrate Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_crea…

博客页面---前端

目录 主页 HTML CSS 文章详细页面 HTML CSS 登录页面 HTML CSS 文章编辑页 HTML CSS 这只是前端的页面组成&#xff0c;还没有接入后端&#xff0c;并不是完全体 主页 HTML <!DOCTYPE html> <!-- <html lang"en"> --> <head>&…

在 C#和ASP.NET Core中创建 gRPC 客户端和服务器

关于gRPC和Google protobuf gRPC 是一种可以跨语言运行的现代高性能远程过程调用 (RPC) 框架。gRPC 实际上已经成为 RPC 框架的行业标准&#xff0c;Google 内外的组织都在使用它来从微服务到计算的“最后一英里”&#xff08;移动、网络和物联网&#xff09;的强大用例。 gRP…

Multi-task Lung Nodule Detection in Chest Radiographs with a Dual Head Network

全局头增强真的有用吗&#xff1f; 辅助信息 作者未提供代码

如何区分相对路径 与 绝对路径?

在网页中有很多需要使用我们URL路径的场景&#xff0c;包括a标签的href、link标签的href、script标签的src、imag标签的src、form中的action、ajax请求的url等等等等。它们都可以使用相对路径和绝对路径来引入文件&#xff0c;那么&#xff0c;我们如何区分相对路径与绝对路径呢…

Unix中的进程和线程-2

1.进程对环境变量的操作 在Linux中&#xff0c;你可以使用以下几个函数来操作环境变量&#xff1a; getenv: 获取环境变量值。setenv: 设置或修改环境变量值。unsetenv: 删除环境变量 getenv: 参数&#xff1a;接受一个字符串作为参数&#xff0c;表示要获取的环境变量的名称。…

【刷题】数据结构——树状数组

一、简介 树状数组用于两种操作&#xff1a; 快速求前缀和 O ( l o g n ) O(logn) O(logn)修改某一个数 O ( l o g n ) O(logn) O(logn) 这两个操作也可以用其他方法结构完成&#xff1a; 用一个数组存每个数&#xff1a;操作1. O ( n ) O(n) O(n)&#xff0c;遍历前n个数求…

Kubernetes(k8s)架构原理

比如在服务器上部署一个博客应用服务,但是太过受欢迎,访问量太大,应用服务经常会挂,使用自动重启工具,并且将应用服务部署在了好几个服务器上,总算抗住了。后来又上线了商城应用服务和语言应用服务,随着应用服务变多,需求也千奇百怪,有的应用服务不希望被外网访问,有…

[Flutter]打包IPA

1.直接使用Xcode运行iOS工程 不用flutter构建&#xff0c;在Xcode中是可以独立进行构建运行和打包发布的。 1).运行项目 先将flutter的build清理 $ flutter clean $ flutter pub get 然后立即用XCode打开iOS工程运行 运行会报错&#xff1a; error: The sandbox is not …

壁纸小程序Vue3(首页布局)

1.创建一个公共目录common来存放css和images App.vue中引用 <style lang"scss"> /*每个页面公共css */ import common/style/common-style.scss; </style> 2.渲染轮播图 <template><view class"homeLayout"><vi…

Godot 4 教程《勇者传说》依赖注入 学习笔记(0):环境配置

文章目录 前言相关地址环境配置初始化环境配置文件夹结构代码结构代码运行 资源文件导入像素风格窗口环境设置背景设置,Tileap使用自动TileMap 人物场景动画节点添加站立节点添加移动动画添加 通过依赖注入获取Godot的全局属性项目声明 当前项目逻辑讲解角色下降添加代码位置问…