求最长公共子串 Longest Common Subsequence
最长公共子串 // Longest Common Subsequence
子串有别于子序列, 子串是连续的, 而子序列可以不连续
/*----------------------------------------------------
题为求 最长对称子串, 实际可以转化成求最长公共子串
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
----------------------------------------------------*/
// 首先,是最长公共子串,而非子序列.
// 进而,对称子串,相当于求某个字符串和其逆序的公共子串,到此转化完毕
我们先看看:最长公共子序列:
用的是动态规划方法, 用一个表来记录中间过程
L[i, j] 表示两个字符串a, b a[0 ~ i], b[0 ~ j] 时的最长公共子序列
故而有状态转移方程:
- L[i, j] =
- 0 // 某个串的长度为0时
- L[i - 1, j - 1] + 1 // a[i] == b[j]
- max{L[i, j - 1], L[i - 1, j]} // a[i] != b[j]
要特别小心,这里的i, j 是指子序列的长度, 而非你要比较的两个字符串的下标
所以比较的时候, 要特别处理好,字符串下标和这个子序列长度的对应关系
同理,对于最长公共子串
有状态转移方程:
- L[i, j] =
- 0 // 某个串的长度为0时
- 0 // a[i] != b[j]
- L[i - 1, j - 1] + 1 // a[i] == b[j]
状态方程如何来? 我以后再补充吧..自己思考一下大致也可以知道
下面给出这道题的解法, 下面有两种数组下标和串长度的方法!!
首先你要明白这张表: 0行0列代表串长度为0,那么必然最长公共子串长度为0
但是如果你直接 i =[ 0,lenA), j = [0,lenB)
比较 a[i]和b[j], 那么肯定会使得a[0]和b[0]处的错误处理,比如 a[0] == b[0]
显然暂时最长公共子串长度 = 1
而你的 L[0, 0] 却统一初始化为0了
// 第一种方法是统一的,虽然表是从 [0,n]填的,但是使得对应的数组比较也是从a[0, n-1]
// 第二种方法,是不太统一的,就是单独去处理边界.
- #include<iostream>
- #include<cstring>
- #include<cmath>
- using namespace std;
- const int EDGE = ;
- int x[EDGE][EDGE];
- char a[EDGE];
- int sa; // size of a
- int func(){
- memset(x, , sizeof(x));
- int i, j, t;
- int maxLen = ;
- for(i = ; i <= sa; ++i){ // 0已被初始化,从长度为1开始即可
- for(j = sa - , t = ; t <= sa; --j, ++t){
- if(a[i - ] == a[j])
x[i][t] = x[i - ][t - ] + ;- else x[i][t] = ;
- if(maxLen < x[i][t]) maxLen = x[i][t];
- }
- }
- return maxLen;
- }
- int main(){
- // freopen("data.in", "r", stdin);
- cin.getline(a, );
- sa = (int)strlen(a);
- cout<<func();
- return ;
- }
- int func(){
- memset(x, , sizeof(x));
- int i, j, t;
- int maxLen = ;
- for(i = ; i < sa; ++i){
- for(j = sa - , t = ; t < sa; --j, ++t){
- if(a[i] == a[j]){
- if(i == || t == ) x[i][t] = ;
- if(i && t) x[i][t] = x[i - ][t - ] + ;
- if(x[i][t] > maxLen) maxLen = x[i][t];
- }
- }
- }
- return maxLen;
- }
第二种方法
求最长公共子串 Longest Common Subsequence的更多相关文章
- 利用后缀数组(suffix array)求最长公共子串(longest common substring)
摘要:本文讨论了最长公共子串的的相关算法的时间复杂度,然后在后缀数组的基础上提出了一个时间复杂度为o(n^2*logn),空间复杂度为o(n)的算法.该算法虽然不及动态规划和后缀树算法的复杂度低,但其 ...
- 最长公共子串(Longest common substring)
问题描述: 给定两个序列 X=<x1, x2, ..., xm>, Y<y1, y2, ..., yn>,求X和Y长度最长的公共子串.(子串中的字符要求连续) 这道题和最长公共 ...
- 最长公共子序列(Longest common subsequence)
问题描述: 给定两个序列 X=<x1, x2, ..., xm>, Y<y1, y2, ..., yn>,求X和Y长度最长的公共子序列.(子序列中的字符不要求连续) 这道题可以 ...
- poj 2774 Long Long Message,后缀数组,求最长公共子串 hdu1403
题意:给出两个字符串,求最长公共子串的长度. 题解:首先将两个字符串连在一起,并在中间加一个特殊字符(字串中不存在的)切割,然后两个串的最长公共字串就变成了全部后缀的最长公共前缀.这时就要用到heig ...
- POJ 2774 Long Long Message (二分 + Hash 求最长公共子串)题解
题意:求最长公共子串 思路:把两个串Hash,然后我们把短的作为LCS的最大可能值,然后二分长度,每次判断这样二分可不可以.判断时,先拿出第一个母串所有len长的子串,排序,然后枚举第二个母串len长 ...
- 文本比较算法Ⅱ——Needleman/Wunsch算法的C++实现【求最长公共子串(不需要连续)】
算法见:http://www.cnblogs.com/grenet/archive/2010/06/03/1750454.html 求最长公共子串(不需要连续) #include <stdio. ...
- 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message
Language: Default Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 21 ...
- 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774
Long Long Message Problem's Link:http://poj.org/problem?id=2774 Mean: 求两个字符串的最长公共子串的长度. analyse: 前面在 ...
- poj2774 Long Long Message 后缀数组求最长公共子串
题目链接:http://poj.org/problem?id=2774 这是一道很好的后缀数组的入门题目 题意:给你两个字符串,然后求这两个的字符串的最长连续的公共子串 一般用后缀数组解决的两个字符串 ...
随机推荐
- R语言常用命令集合
help.start()//打开帮助文档 q()//推出函数 ls()//返回处于现在名空间的对象名称 rm()//清楚对象:rm(list=ls())清除所有内存数据 gc()//垃圾回收数据 sq ...
- vue nextTick深入理解-vue性能优化、DOM更新时机、事件循环机制
一.定义[nextTick.事件循环] nextTick的由来: 由于VUE的数据驱动视图更新,是异步的,即修改数据的当下,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图 ...
- 《Think Python》第15章学习笔记
目录 <Think Python>第15章学习笔记 15.1 程序员定义的类型(Programmer-defined types) 15.2 属性(Attributes) 15.3 矩形( ...
- Datenstruktur und Algorithmus
In der Informatik und Softwaretechnik ist eine Datenstruktur ein Objekt zur Speicherung und Organisa ...
- vue 获取数据联动下拉框select ,并解决报Duplicate value found in v-for="...": "". Use track-by="$index" 错误
公司项目中遇到一个问题,联动下拉框,并且数据是使用vue-resource从后台获取的,格式不利于输出联动下拉框,联动下拉框是第一个下拉框输出一个数组里每一项json的一个text值,从而第二下拉框输 ...
- json和xml以及ajax的数据格式用法
JSON的两个方法: 1.将字符串转换为JSON格式:parse(). 2.将原生JavaScript值转换为JSON字符串:stringify(); <!DOCTYPE html> &l ...
- Timer控件
Timer控件是定期引发事件的控件,时间间隔的长度由interval属性定义,其值以毫秒为单位吗,若启用了该组件,则每个事件间隔引发一个Tick事件,Timer组件的主要方法包括start和stop, ...
- [javaSE] 数据结构(栈)
栈(stack)是一种线性存储结构,有以下特点: 1.栈中数据是按照先进后出的方式进出栈的 2.向栈中添加删除元素时,只能从栈顶进行操作 使用数组实现栈 定义一个类ArrayStack 实现入栈方法p ...
- Web前端性能优化的三个偏方
首先牢骚几句...这一次性能优化针对的模块,初次开发阶段客户给的时间就非常少,俩月时间跳过设计一边需求分析一边编码,最后干出6000+的代码行.最终结果嘛,呵呵,除开一堆bug不说,性能就是个非常大的 ...
- [翻译]Review——How JavaScript works:The building blocks of Web Workers
原文地址:https://blog.sessionstack.com/how-javascript-works-the-building-blocks-of-web-workers-5-cases-w ...