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,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
随机推荐
- L175 Endorestiform Nucleus: Scientist Just Discovered a New Part of the Human Brain
The newly named Endorestiform Nucleus sits in the inferior cerebellar小脑 peduncle, at the junction be ...
- IE 问题集合
1.zIndex在ie需要 先对比父级的层级
- Windows环境下 PyQt5 如何安装MySql驱动 (PyQt5连接MYSQL时显示Driver not loaded解决方案)
参考文章: https://blog.csdn.net/qq_38198744/article/details/80261695 前文说过如何在Ubuntu环境下 为PyQt5 安装MySql驱动, ...
- C语言--第三次作业
要求一 . 1)C高级第三次PTA作业(1) 题目6-1 1.设计思路 (1)主要描述题目算法 第一步:将月份分别赋值: 第二步:利用switch语句,输 ...
- SpringBoot实现网站注册,邮件激活码激活功能
项目源码:https://gitee.com/smfx1314/springbootemail 上一篇文章已经讲到如何springboot如何实现邮件的发送,趁热打铁,这篇文章实现如下功能. 很多网站 ...
- 折半查找(C语言)
一.二分查找 在C和C++里,二分查找是针对有序数组所用的一种快速查找元素的方法. 二.二分查找的条件以及优缺点 条件:针对有序数组(元素从小到大或从大到小) 优点:查询速度较快,时间复杂度为O(n) ...
- 在VS2008中使用WSE 3.0【转】
原文:http://www.cnblogs.com/chenxizhang/archive/2008/07/25/1251626.html 在VS2008中使用WSE 3.0 WSE 是微软推出的一套 ...
- 浅谈ASP.NET ---- 系列文章
[01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作篇)(下) [04]浅谈ASP. ...
- CentOS 6.0 VNC远程桌面配置方法(转帖)
问题:新装开发机,安装VNC软件后,按照下面文档配置后,无法用VNC view连接,关闭防火墙后可以连上 解决方法:说明问题出在防火墙配置上,除了允许15900端口外,还有其他要设,经过排查后,加上如 ...
- Erlang tool -- recon
遇见recon 以来, 每次定位系统瓶颈, 总是能让我眼前一亮. 比如说, 定位非尾递归导致的内存暴涨, 定位引发CPU满载的进程.得心应手,每每额手称庆. recon 是ferd 大神 释出的一个 ...