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,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
随机推荐
- php http build query
http_build_query (PHP 5, PHP 7) http_build_query — 生成 URL-encode 之后的请求字符串 说明¶ string http_build_quer ...
- SpringDataJPA最佳实践(一)简介
在团队中使用SpringDataJPA有一段时间了,也踩过一些坑,这里记录一下学习历程. 1.简介 Spring Data是什么 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架 ...
- vue url生产二维码
<template> <div id="QRcode"> <div class='QR-qrcode' style='display:none;'&g ...
- 解决brew报错:Another active Homebrew update process is already in progress
在mac终端下执行:brew install glew结果报错: Error: Another active Homebrew update process is already in progres ...
- Python 使用PyMySql 库 连接MySql数据库时 查询中文遇到的乱码问题(实测可行) python 连接 MySql 中文乱码 pymysql库
最近所写的代码中需要用到python去连接MySql数据库,因为是用PyQt5来构建的GUI,原本打算使用PyQt5中的数据库连接方法,后来虽然能够正确连接上发现还是不能提交修改内容,最后在qq交流群 ...
- 【css样式生成 & 图片合并压缩工具】Sprite,你值得拥有
好久好久没有更新博客了,越来越懒...话说懒也有懒的好处,懒的时候你可能会想着用些神马方法来帮你偷懒.没错,下面就给大家介绍个博主前不久开发的[css样式生成 & 图片合并压缩工具]Spirt ...
- addpath
这个命令见得很多了,一直懒得理他,自己直接加绝对路径.但是,这个破命令出现太多,我改得都掉脾气,写写. 1. 添加路径:addpath('当前路径中的文件夹名1','当前路径下的文件夹名2','当前 ...
- [QT][SQLITE]学习记录二 日期查询
资料例程: 1.dongfangyu SQL时间段查询 : http://blog.csdn.net/dongfangyu/article/details/4607236 2.痕网 - henw S ...
- ringojs 使用rp 包管理web 应用依赖
rp 是一个类似npm 的包管理工具,我们可以使用package.json 定义依赖 然后执行rp install 即可,类似ringo-admin 的功能 其中packages 类似node 的no ...
- socket编程---TCP
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接.在这时如果有个客户端初始化一个Socket,然后连接服务器(connec ...