[Codewar训练]Longest Common Subsequence(Performance version)(最长子序)
问题:
段位:4
说明:
查找两个字符串之间,按照顺序匹配出最长的一个字符串出来,匹配时候按照各个字符相对位置顺序,不用连续,然后返回匹配出来的字符串,相同长度的返回任意一个就行。
输入案例:
// 匹配时候按照各个字符相对位置顺序,不用连续,然后返回匹配出来的字符串
lcs( "abcdef", "abc" ) => "abc"
lcs( "abcdef", "acf" ) => "acf"
lcs( "132535365", "123456789" ) => "12356"
lcs( "abcdefghijklmnopq", "apcdefghijklmnobq" ) => "acdefghijklmnoq"
lcs( "abc", "acb" ) => "ac" "ab" // 相同长度,返回任意一个就可以
我的代码:
毕竟不是科班出身,动态规划还真的太烂了,我用了String[][] 来进行动态规划,性能是不怎样,之前想法是其实也是打表,然后进行一个DiagonalTraverse 这道题的遍历方法,想把最长的一条斜链直接求出来,就不用拿String[][] 来存动态规划的结果,拿个boolean[]就可以了,不过还是失败了。
public class LongestCommonSubsequence {public static void main(String[] args) {System.out.println(Lcs.lcs("nothardlythefinaltest", "zzzfinallyzzz"));System.out.println(Lcs.lcs("a", "a"));System.out.println(Lcs.lcs("abcdefghijklmnopq", "apcdefghijklmnobq"));}static class Lcs {static String lcs(String a, String b) {if(a == null || b == null || a.equals("") || b.equals("")) return "";int alen = a.length();int blen = b.length();// 长度+1 是因为算法里面的需求String[][] dp = new String[blen + 1][alen + 1];// 单线程拼接的问题肯定用builder,用+号很明显jdk循环中不断创建builder性能不行StringBuilder builder = new StringBuilder();for (int i = blen; i -- > 0;) {for (int j = alen; j -- > 0;) {if (a.charAt(j) == b.charAt(i)) {// 先进行拼凑builder.append(a.charAt(j));// 非空才拼接if(dp[i + 1][j + 1] != null) builder.append(dp[i + 1][j + 1]);dp[i][j] = builder.toString();// 然后置零builder.setLength(0);}else {// 纯粹为了拿来判断长度if(dp[i + 1][j] == null) dp[i + 1][j] = "";if(dp[i][j + 1] == null) dp[i][j + 1] = "";// 如果长度一致不影响结果,拿长度最长就行dp[i][j] = dp[i + 1][j].length() < dp[i][j + 1].length()? builder.append(dp[i][j + 1]).toString() : builder.append(dp[i + 1][j]).toString();builder.setLength(0);}}}return dp[0][0]; // do it!}}
}
[Codewar训练]Longest Common Subsequence(Performance version)(最长子序)相关推荐
- C++longest common subsequence最长公共子序列的实现(附完整源码)
C++longest common subsequence最长公共子序列 longest common subsequence最长公共子序列的完整源码(定义,实现,main函数测试) longest ...
- 【算法导论学习-29】动态规划经典问题02:最长公共子序列问题(Longest common subsequence,LCS)...
2019独角兽企业重金招聘Python工程师标准>>> 问题描述:序列X={x1,x2,-,xn},Y={y1,y2,-,yn},当Z={z1,z2-,zn}是X的严格递增下标顺序( ...
- UVA10405 Longest Common Subsequence【LCS+DP】
Given two sequences of characters, print the length of the longest common subsequence of both sequen ...
- 最长公共子串LCS (Longest Common Subsequence) 算法
三个方法都有所借鉴,但代码部分是自己试着写出来的,虽然最后的运行结果都是正确的,但此过程中难免会有考虑不周全的地方,如发现代码某些地方有误,欢迎指正.同时有新的想法,也可以提出! 采用顺序结构存储串, ...
- LeetCode——1143. 最长公共子序列(Longest Common Subsequence)[中等]——分析及代码(Java)
LeetCode--1143. 最长公共子序列[Longest Common Subsequence][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 (1)思路 (2)代 ...
- 最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr...
问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y=& ...
- leetcode1143. Longest Common Subsequence
题目:题目链接 官方题解 强烈建议官方题解,通俗易懂,别看我的了,真不建议 题目大意:LCS(subsequence):求两个字符串text1,text2的最长公共子序列(注意是序列,不是字串,可以不 ...
- UVA 10405 - Longest Common Subsequence
本题是求最长公共子序列,题目也给了提示,是求最长公共子序列最基本的题. 注意字符串的读取要用gets()而不用scanf()因为字符串里可能有空格. 代码如下: #include<stdio.h ...
- leetcode 1143. Longest Common Subsequence | 1143. 最长公共子序列(动态规划,暴力递归->傻缓存->dp)
题目 https://leetcode.com/problems/longest-common-subsequence/ 题解 经典的 暴力递归 -> 傻缓存 -> dp 题目,以 &qu ...
最新文章
- BCH网络成功发布第一个商业级别的Token
- php学习之Model类
- Kotlin与Java的几种单例模式
- Redis 多线程网络模型全面揭秘|网络硬核系列
- ARC 101 D - Median of Medians
- java .vm h2_java-H2服务器在调试时挂起
- 自然场景下的文字检测:从多方向迈向任意形状
- java+jquery实现长轮询案例_网页实时聊天之js和jQuery实现ajax长轮询
- jQuery实用Ajax loading旋转指示器插件
- 判断是否是合法的IP地址
- 简单的小愿望,就这么难实现
- mac mini u盘安装系统_U盘重装Mac全新操作系统教程
- C/C++回溯经典练习:马的走法
- 单模光纤和多模光纤的对比
- android官方模拟器下载安装,网易MuMu模拟器
- SparkLink星闪技术之SLB概述
- java基础知识-----转
- intelliJ IDEA启用快速定位文件图标
- 计算机底层01-计算机发展史
- LeetCode 362. 敲击计数器