最长公共子串  // 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的更多相关文章

  1. 利用后缀数组(suffix array)求最长公共子串(longest common substring)

    摘要:本文讨论了最长公共子串的的相关算法的时间复杂度,然后在后缀数组的基础上提出了一个时间复杂度为o(n^2*logn),空间复杂度为o(n)的算法.该算法虽然不及动态规划和后缀树算法的复杂度低,但其 ...

  2. 最长公共子串(Longest common substring)

    问题描述: 给定两个序列 X=<x1, x2, ..., xm>, Y<y1, y2, ..., yn>,求X和Y长度最长的公共子串.(子串中的字符要求连续) 这道题和最长公共 ...

  3. 最长公共子序列(Longest common subsequence)

    问题描述: 给定两个序列 X=<x1, x2, ..., xm>, Y<y1, y2, ..., yn>,求X和Y长度最长的公共子序列.(子序列中的字符不要求连续) 这道题可以 ...

  4. poj 2774 Long Long Message,后缀数组,求最长公共子串 hdu1403

    题意:给出两个字符串,求最长公共子串的长度. 题解:首先将两个字符串连在一起,并在中间加一个特殊字符(字串中不存在的)切割,然后两个串的最长公共字串就变成了全部后缀的最长公共前缀.这时就要用到heig ...

  5. POJ 2774 Long Long Message (二分 + Hash 求最长公共子串)题解

    题意:求最长公共子串 思路:把两个串Hash,然后我们把短的作为LCS的最大可能值,然后二分长度,每次判断这样二分可不可以.判断时,先拿出第一个母串所有len长的子串,排序,然后枚举第二个母串len长 ...

  6. 文本比较算法Ⅱ——Needleman/Wunsch算法的C++实现【求最长公共子串(不需要连续)】

    算法见:http://www.cnblogs.com/grenet/archive/2010/06/03/1750454.html 求最长公共子串(不需要连续) #include <stdio. ...

  7. 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message

    Language: Default Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 21 ...

  8. 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774

    Long Long Message Problem's Link:http://poj.org/problem?id=2774 Mean: 求两个字符串的最长公共子串的长度. analyse: 前面在 ...

  9. poj2774 Long Long Message 后缀数组求最长公共子串

    题目链接:http://poj.org/problem?id=2774 这是一道很好的后缀数组的入门题目 题意:给你两个字符串,然后求这两个的字符串的最长连续的公共子串 一般用后缀数组解决的两个字符串 ...

随机推荐

  1. mvn pom

    使用本地指定目录下jar包 <dependency> <groupId>com.myself.abc</groupId> <artifactId>sam ...

  2. 剑指offer(31-35)编程题

    整数中1出现的次数(从1到n整数中1出现的次数) 把数组排成最小的数 丑数 第一个只出现一次的字符位置 数组中的逆序 31.求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数 ...

  3. maven在pom文件中添加你想要的jar包

    概述:POM 文件里面的依赖jar包经常需要添加, 仅需要在google中代码查找 :maven 你需的jar包名称 repository 用了Maven,所需的JAR包就不能再像往常一样,自己找到并 ...

  4. 多功能电子通讯录(涉及到了双向链表的使用,Linux文件编程等等)

    readme.txt //作为一个程序员,我们咋么能不写用户手册呢!MSP的我觉得用户体验是王道,苹果手机的用户体验的确不错!不过WP加油!我去,扯远了!赶紧看我的程序吧!  歡迎使用多功能電子通訊錄 ...

  5. C#泛型设计的一个小陷阱.

    距离上次发表博客已经有几年了. 对于没能坚持更新博客,实在是感觉到甚是惭愧. 闲言少叙, 直接切入主题. 背景 最近一直在对于公司一个网络通信服务程序使用.net core 进行重构.重构的目的有两个 ...

  6. 整理一些前端开发比较好的node包

    1.一个base64转换的包 !https://www.npmjs.com/package/js-base64 2 js 压缩 !https://www.npmjs.com/package/uglif ...

  7. PHP项目学习1

    最近在学习PHP,看了<轻松学PHP>,2天看完,学习了很多基础知识,可是没有出什么成果.然后看<PHP项目开发全程实录>,里面讲到一个online影视365网,刚好有一个朋友 ...

  8. java自学-编程入门

    java语言写的代码需要先编译为可执行文件,才能被jvm执行.在下载的jdk安装目录下的bin目录,有两个可执行程序java.exe和javac.exe,javac就是用来编译的,java是执行编译后 ...

  9. 配置JDK1.7开发环境

    学习java知识,首先要安装jdk来配置开发环境和java运行环境,本文介绍一下JDK配置流程和验证配置成功的方法. 一.配置JDK 1.首先下载jdk1.7压缩包并解压到D盘. 2.我的电脑--右键 ...

  10. varchar(n)跟varchar(max)的区别

    本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...