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,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
随机推荐
- generator.xml文件与相关配置插件
一,generator.xml配置信息 1 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...
- 2017年7月ROS学习资料小结
<孙子兵法·谋攻篇>:"上兵伐谋,其次伐交,其次伐兵,其下攻城:攻城之法为不得已." 任何发生在自己国土上的战争,即便胜利,也饱含屈辱. ----~~~~----Gaz ...
- asp.net core microservices 架构之分布式自动计算(三)-kafka日志同步至elasticsearch和kibana展示
一 kafka consumer准备 前面的章节进行了分布式job的自动计算的概念讲解以及实践.上次分布式日志说过日志写进kafka,是需要进行处理,以便合理的进行展示,分布式日志的量和我们对日志的重 ...
- L3-013 非常弹的球 (30 分)
刚上高一的森森为了学好物理,买了一个“非常弹”的球.虽然说是非常弹的球,其实也就是一般的弹力球而已.森森玩了一会儿弹力球后突然想到,假如他在地上用力弹球,球最远能弹到多远去呢?他不太会,你能帮他解决吗 ...
- flask第二十六篇——模板【控制语句】【2】
如果你也在学flask,就请加船长的公众号:自动化测试实战 我们先补充一下for循环的知识,我们之前说过,flask是由Jinja2+sqlAlchemy+werkzeug组成的,我们现在学的控制语句 ...
- OLEDB操作Excel
使用OLEDB操作Excel 的方法 OleDbConnection conn = null; try { //fileName ...
- 零基础学Cocos2d-X 3.0 - 04
忙完两个项目后.最终有时间继续学习Cocos2d-X 了. 常听人说.Cocos2d-X 有四个类是最经常使用的,包含: Director 类----> 导演 Scene 类 -----> ...
- 使用VS2008进行WEB负载测试
软件测试中使用VS2008进行WEB负载测试 最近接触关于多线程的软件测试,所以对vs2005里的测试开始感兴趣,今天学习试用了一下,记下所获得的. vs 测试分“WEB测试”,“单元测试”,“负载测 ...
- Linux下利用Shell使PHP并发采集淘宝产品
上次项目中用到<<PHP采集淘宝商品>> 此方法有一个缺点,就是执行效率问题.一个商品采集平均需要0.8秒.那10000个商品采集完需要2个半小时. 首先想到的解决办法是并发. ...
- Linux内核 TCP/IP参数调优
http://www.360doc.com/content/14/0606/16/3300331_384326124.shtml