2192-Zipper 求最长公共子序列的解题报告
主要的思考方向就是求dp里面的最长公共子序列。至于字符串本身的判别并不是重点。
根据网上poj的分类,这个题是dp求最长公共子序列,其实用暴力的方法也能通过。暴力的方法比较简单就不多说了。主要讲讲dp吧。思路就是分别求第一个字符串和第二个字符串与第三个字符串的最长公共子序列的长度是否等于其自身的长度。lcs的算法比较简单,可参考算法导论直接写出。但是仅仅判断长度是不够的。还需要考虑两点:
(1)判断第三个字符串有无多余的字符。
(2)是否存在某个字符只出现一次却是第一、二个字符串公用的。
如果只是想ac掉这道题,考虑第一点就够了,因为本题数据太弱了,我就是只考虑了第一点,当水题做的。但是我想出题者的本意应该是第二点也需要考虑到的。因为我看到discuss里面有前辈这样说了。acm里面牛人可是非常多的。这两点可以通过两个双重循环一次解决,虽然是最耗时的,幸好数据规模较小,无大碍。设置一个标记数组标记状态即可。首先对第一个字符和第三个字符处理,如果某个字符都出现了,而且该下标处没有标记,则标记,break。对第二第三个字符串做同样处理。再看第三个字符串里面是否还有没有被标记的地方,有,则no,没有即yes。对于此类题目,细心是关键。此处提供代码,供参考:
题目出处:http://poj.org/problem?id=2192
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
const int MAX = 401;
int d[MAX][MAX], v[MAX];
int lcs(string s1, string s2)//LCS算法
{int k = (int)s1.length();int l = (int)s2.length();for (int i = 0; i <= k; i++)d[i][0] = 0;for (int i = 1; i <= l; i++)d[0][i] = 0;for (int i = 1; i <= k; i++)for (int j = 1; j <= l; j++)if (s1[i -1] == s2[j - 1])d[i][j] = d[i - 1][j - 1] + 1;else d[i][j] = max(d[i - 1][j], d[i][j - 1]);return d[k][l];
}
bool fun(string a, string b, string c)//判断c是否可以由a,b组成
{int la = (int)a.length(), lb = (int)b.length(), lc = (int)c.length();if (la == lcs(a, c) && lb == lcs(b, c)){int temp = 0, k = 0;memset(v, 0 ,sizeof(v));for (int i = 0; i < la; i++)for (int j = 0; j < lc; j++)if (!v[j] && a[i] == c[j]){v[j] = 1;break;}for (int i = 0; i < lb; i++)for (int j = 0; j < lc; j++)if (!v[j] && b[i] == c[j]){v[j] = 1;break;}for (int i = 0; i < lc; i++)if (!v[i]){temp = 1;break;}if (!temp)return true;}return false;
}
int main()
{int tot, count = 1;string x, y, z;cin>>tot;while (tot--){cin>>x>>y>>z;if (fun(x, y, z))printf("Data set %d: yes\n", count++);else printf("Data set %d: no\n", count++);}return 0;
}
转载于:https://www.cnblogs.com/neulike/archive/2011/02/14/1954078.html
2192-Zipper 求最长公共子序列的解题报告相关推荐
- Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离
Algorithm:C++/python语言实现之求旋转数组最小值.求零子数组.求最长公共子序列和最长公共子串.求LCS与字符串编辑距离 目录 一.求旋转数组最小值 1.分析问题 2.解决思路 二.求 ...
- 求最长公共子序列长度
求两个字符串的公共子序列 1.求最长公共子序列(子序列可以不连续) 这是一道动态规划题,设二维数组dp[i][j],dp[i][j]表示a串前i个字符(包括第i个)与b串前j个字符(包括第j个)所有的 ...
- 求最长公共子序列的空间优化。
我们在求最长公共子序列时一般方法是c(i,j) = c(i-1,j-1) if s1[i] = s2[j] or max(c[i-1][j],c[i][j-1]) if s1[i] != s2[j]. ...
- 文本比较算法Ⅶ——线性空间求最长公共子序列的Nakatsu算法
在参阅<A Longest Common Subsequence Algorithm Suitable for Similar Text Strings>(Narao Nakatsu,Ya ...
- 动态规划:求最长公共子序列和最长公共子串
最长公共子序列(LCS): 这同样是一道经典题目,定义就不说了. 为了方便说明,我们用Xi代表{x1,x2,‥xi},用Yj代表{y1,y2,‥yj}.那么,求长度分别为m,n的两个序列X,Y的LCS ...
- Java动态规划求最长公共子序列(LCS)
最长公共子序列(LCS) 定义:在序列X和序列Y中同时出现的元素,按照脚标从小到大排列的这样的序列. String x = "ABCBDABGGGTT"; ...
- 字符串求最长公共子序列(相似度计算)
方法一: 思想 由大到小的截取并返回 保证如果返回肯定是返回最大的 短字符串的处方式:第一次for循环:递减 .第二次for循环 :截取该长度字符串的可行方案个数 然后截取 长字符串长度处理方 ...
- 【谈谈】动态规划——求最长公共子序列
首先,我们要搞清楚所谓最长公共子序列的概念.不然很容易把它和最长公共子串混淆,两者区别是:子序列只需要字符保持相对顺序,并不要求像公共字串那样组成字符还需连续. 问题: 给定两个字符串数组序列: X[ ...
- 动态规划算法---求最长公共子序列
最长公共子序列和最长公共子串区别 最长公共子串(Longest Common Substring)与最长公共子序列(Longest Common Subsequence)的区别: 子串要 ...
最新文章
- python 保存内容到记事本里面
- 漫画谈-微积分(一)
- Gentoo 安装日记 12 (配置内核 :电源和bios)
- wordpress 模板中的链接_WordPress 官方AMP插件已更新至2.0版
- 8乘8led点阵显示数字_51单片机程序设计:[7]88点阵显示汉字
- Matlab 使用GPU加速 转载
- AltiumDesigner17快捷键
- 【华为云技术分享】大数据容器化成趋势,华为云BigData Pro一马当先
- 国庆快乐,送3本Python书
- MediaInfo源代码分析 1:整体结构
- 【学习总结】GirlsInAI ML-diary day-7-数据类型转换
- 亚信安全特邀出席2016首届国际反病毒大会
- C++--第8课 - 类中的封装
- SaaSBase:什么是数云麒麟CRM?
- C++ 验证DH算法
- ios备忘录下载安卓版_ios8备忘录app软件下载
- 解惑好文:移动端H5页面高清多屏适配方案
- 图论介绍和PyTorch Geometric(PyG)库基础知识
- Pro Tools 贴士- 使用Snapper快速试听和导入音频素材
- sql查询成绩表中每一科成绩最高的分数以及这个学生的名字,学科名