最长公共子串  // 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. MYSQL中数据类型介绍

    一.MySQL的数据类型 主要包括以下五大类: 主要包括以下五大类: 整数类型:bit.  int . bit int . small int . tiny int . medium int .boo ...

  2. spring cloud连载第二篇之Spring Cloud Config

    Spring Cloud Config Spring Cloud Config为分布式服务提供了服务侧和客户侧的外部配置支持.通过Spring Cloud Config你可以有一个统一的地方来管理所有 ...

  3. SQL:存储过程

    1/什么是存储过程及概念 Transact-SQL中的存储过程,非常类似于.Net语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可 ...

  4. winform从table1获取需要的数据转存储到table2中

    小技术一个,记录一下 ,以下记录的是用两种方式来实现,数据表的转移 table转存数据之前首先要明确两个函数: Add():是指在最后一行添加一行 InsertAt():可以插入到表中的指定行 需求: ...

  5. OC与JS交互之WKWebView

    上一篇文章我们使用了JavaScriptCore框架重写了之前的示例,iOS8苹果偏爱HTML5,重构了UIWebVIew,给我们带来了WKWebView,使其性能.稳定性.功能大幅度提升,也更好的支 ...

  6. 二、hbase shell工具

    hbase单节点安装请参考: https://www.cnblogs.com/lay2017/p/9944387.html 下文演示hbase shell工具常用的命令,首先启动hbase以及进入sh ...

  7. WCF 4.0 如何编程修改wcf配置,不使用web.config静态配置

    How to programmatically modify WCF without web.config setting WCF 4.0 如何编程修改wcf配置,不使用web.config静态配置 ...

  8. Windbg 脚本命令简介 二, Windbg command

    Windbg  脚本命令简介 二, Windbg  script command $<, $><, $$<, $$><, $$>a< (Run Scri ...

  9. bnu 4067 美丽的花环

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=4067 美丽的花环 Time Limit: 1000ms Case Time Limit: 1000m ...

  10. fuzhou 1692 Key problem ***

    Problem 1692 Key problem Accept: 103    Submit: 553 Time Limit: 1000 mSec    Memory Limit : 32768 KB ...