POJ1458 最长公共子序列
描述:
给定两个字符串,求其最长公共子序列(不用连续),
输入:
abc bcc
programning content
输出:
2
2
解法:
动态规划。
定义dp[i][j]表示s1到i索引,以及s2到j索引为止的最长公共子序列,
则定义如下:
dp[i][j] = dp[i - 1][j - 1] + 1, 若s1[i] == s2[j]
max(dp[i - 1][j], dp[i][j - 1]), 若s1[i] != s2[j]
遍历此二维数组即可,时间复杂度为O(m*n),即两字符串长度之积。
以下代码空间优化,只用一维数组:由于更新只和前一个,上一个有关,某些情况下和上前一个有关,用back变量保存。
#include <string>
#include <iostream>
using namespace std; int main()
{
string s1, s2; while( cin >> s1 >> s2) {
int* arr = new int[s2.size()];
arr[] = s1[] == s2[]?:; for (int i = ; i < s1.size(); ++i) {
int back;
for (int j = ; j < s2.size(); ++j) {
if (i == ) {
if (j == )
arr[] = s1[] == s2[]?:;
else
arr[j] = arr[j - ] == ?:(s1[] == s2[j]?:);
} else if (j == ) {
back = arr[];
arr[] = arr[] == ?:(s1[i] == s2[]?:);
} else {
int sa = arr[j];
arr[j] = s1[i] == s2[j]?(back + ):max(arr[j - ], arr[j]);
back = sa;
}
}
}
cout << arr[s2.size() - ] << endl;
}
return ;
}
时间复杂度为O(m*n),两字符串长度之和;
空间复杂度为O(m),任选一个字符串长度都可以,交换一下字符串就行。
POJ1458 最长公共子序列的更多相关文章
- POJ-1458(LCS:最长公共子序列模板题)
Common Subsequence POJ-1458 //最长公共子序列问题 #include<iostream> #include<algorithm> #include& ...
- 最长公共子序列LCS(POJ1458)
转载自:https://www.cnblogs.com/huashanqingzhu/p/7423745.html 题目链接:http://poj.org/problem?id=1458 题目大意:给 ...
- 最长公共子序列(POJ1458)
题目链接:http://poj.org/problem?id=1458 题目大意:给出两个字符串,求出这样的一个最长的公共子序列的长度:子序列中的每个字符都能在两个原串中找到,而且每个字符的先后顺序和 ...
- poj1458 求最长公共子序列 经典DP
Common Subsequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 45763 Accepted: 18 ...
- POJ-1458.CommonSubsequence.(DP:最长公共子序列裸题)
本题大意:给出两个字符串,让你求出最长公共子序列的长度并输出. 本题思路:本题是经典的DP问题,由于是两个字符串,那么我们就用一个二维数组来进行区分,用dp[ i ][ j ]来表示在s1和s2中分别 ...
- POJ-1458 Common Subsequence(线性动规,最长公共子序列问题)
Common Subsequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44464 Accepted: 18186 ...
- POJ 1458 Common Subsequence(最长公共子序列LCS)
POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...
- 用python实现最长公共子序列算法(找到所有最长公共子串)
软件安全的一个小实验,正好复习一下LCS的写法. 实现LCS的算法和算法导论上的方式基本一致,都是先建好两个表,一个存储在(i,j)处当前最长公共子序列长度,另一个存储在(i,j)处的回溯方向. 相对 ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
随机推荐
- 《DSP using MATLAB》Problem 2.9
代码: %% ------------------------------------------------------------------------ %% Output Info about ...
- test20181025 Color
题意 分析 自己的想法 可以莫队+平衡树. 对每个颜色维护一颗平衡树,然后移动莫队端点的时候在平衡树中查询. 区间加操作容易实现. 单点修改转化为平衡树的插入删除. 感谢Z前辈的指导. 时间复杂度\( ...
- koa/koa2项目搭建
一键生成koa/koa2项目: 1. npm install -g koa-generator 2.新建项目目录 koa mytest (koa1项目) koa2 koa2test (koa2项目) ...
- C#/.NET主线程与子线程之间的关系
以前一直没有在程序中写过总结,再翻开程序时却不知所云,所以我决定写总结 一般 一个应用程序就对应一个进程,一个进程可有一个或多个线程,而一般有一个主线程. 有的博客上说“至少 ...
- Makefile之自动变量篇
自动变量假设您编写一个编译‘.c’文件生成‘.o’文件的规则:您怎样编写命令‘CC’,使它能够操作正确的文件名?您当然不能将文件名直接写进命令中,因为每次使用隐含规则操作的文件名都不一样. 您应该使用 ...
- VS2017开发Linux平台上的程序
重装系统后安装VS2015时卡住了,于是试试看VS2017怎样,听说还支持调Linux.发现VS2017跟12/13/15又有了新的飞跃,竟然支持模块化下载,对于我这种主要写C++简直是个福音,勾了L ...
- 转转转![Spring MVC] - 500/404错误处理-SimpleMappingExceptionResolver
参考博客: http://www.cnblogs.com/dongying/p/6129937.html http://www.cnblogs.com/rollenholt/archive/2012/ ...
- 马士兵Spring-AOP-XML配置(2)
一. UserDAO.java: package com.cy.dao; import com.cy.model.User; public interface UserDAO { public voi ...
- 根据给定文件编写Makefile文件 两种方法编译
实例一 1.分析源文件代码依赖关系 mian.c #include "test1.h" #include "test2.h" #include <stdi ...
- Windows 10 修改系统环境变量后,CMD生效,Powershell未生效
Windows 10 修改系统环境变量后 1.CMD重新打开,新环境变量已经生效: 2.Shift+右键Powershell重新打开,新环境变量没有生效: 3.貌似服务(Apache24)中使用的环境 ...