LCS(Longest Common Substring)算法

原创 2016年08月28日 22:59:23

在听数据结构的时候讲到了LCS的一个有意思的算法,mark一下:

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int lcs(const string, const string);
int max(int, int);

int main() {
    //test
    cout << lcs("qqqqaqaqqqaq", "zzzazazazz") << endl;
    system("pause");
}

int lcs(const string a, const string b) {
    vector<vector<int>> temp(a.size());
    for (int i = 0; i < a.size(); i++) temp[i].resize(b.size());

    for (int i = 0; i < a.size(); i++) {
        if (a[i] == b[0] || i != 0 && temp[i - 1][0] == 1) temp[i][0] = 1;
        else temp[i][0] = 0;
    }
    for (int j = 0; j < b.size(); j++) {
        if (b[j] == a[0] || j != 0 && temp[0][j - 1] == 1) temp[0][j] = 1;
        else temp[0][j] = 0;
    }

    for (int i = 1; i < a.size(); i++) {
        for (int j = 1; j < b.size(); j++) {
            if (a[i] == b[j]) temp[i][j] = 1 + temp[i - 1][j - 1];
            else temp[i][j] = max(temp[i][j - 1], temp[i - 1][j]);
        }
    }


    for (int i = 0; i < a.size(); i++) {
        for (int j = 0; j < b.size(); j++) {
            cout << temp[i][j];
            if (j != b.size()) cout << " ";
        }
        cout << endl;
    }

    return temp[a.size() - 1][b.size() - 1];
}

int max(int a, int b) { return a > b ? a : b; }

它将字符串问题利用二维数组求路径的方法给出了解,而且复杂度仅为O(n),蛮好蛮好

Longest Common Substring

Given two strings, find the longest common substring. Return the length of it.  Notice The ...
  • awawfwfw
  • awawfwfw
  • 2016年12月13日 14:46
  • 269

[Lintcode]Longest Common Substring最长公共子串

Given two strings, find the longest common substring. Return the length of it. 分析:算法与最长公共子序列大致...
  • jc69186918
  • jc69186918
  • 2016年10月18日 19:13
  • 197

hdu1403Longest Common Substring

Longest Common Substring Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java...
  • acm_fighting
  • acm_fighting
  • 2015年09月18日 13:25
  • 261

spoj 1811 LCS - Longest Common Substring (后缀自动机)

spoj 1811 LCS - Longest Common Substring 题意: 给出两个串S, T, 求最长公共子串。 限制: |S|, |T| 思路: dp O(...
  • whai362
  • whai362
  • 2015年08月14日 20:38
  • 1418

SPOJ LCS(Longest Common Substring-后缀自动机-结点的Parent包含关系)

1811. Longest Common Substring Problem code: LCS A string is finite sequence of ch...
  • nike0good
  • nike0good
  • 2013年08月23日 17:26
  • 1327

常见算法问题之最长公共子串问题(Longest common substring problem)

对于寻找两个字符串的最长公共子字符串的问题,暴力搜索的方式的时间复杂度将高达O(n^3), 而通过后缀树的方式可将时间复杂度降低到O(n^2)。以下是我实现的C++源码:#include #incl...
  • jaye16
  • jaye16
  • 2017年02月16日 23:09
  • 343

HDU 1403 Longest Common Substring

后缀数组入门题。 注意一下题目中的是'substring',不是subsequence。 题目的数据范围是100000,所以用平常的o(n^2)的算法会TLE。 选择后缀数组来进行操作。 考虑...
  • u011277193
  • u011277193
  • 2014年02月27日 21:23
  • 363

Longest Common Subsequence (LCS)最长公共子串

Longest CommonSubsequence (LCS). The following are some instances. a)      X: xzyzzyx   Y: zxyyzxz b...
  • chenguibao
  • chenguibao
  • 2015年07月01日 14:31
  • 601

动态规划 (Dynamic Programming) 之 最长公共子序列(Longest Common Subsequence)

这个问题也是算法导论上提过的问题。注意这个问题是Subsequence不是Substring。substring的话就是子串,子串的要求的连续相等的字符序列,而subsequence不要求连续。比如说...
  • hhygcy
  • hhygcy
  • 2009年03月02日 11:20
  • 11520

【后缀自动机】SPOJ(LCS2)[Longest Common Substring II]题解

题目概述求n个串的最长公共子串。解题报告这道题是SPOJ1811的升级版,还是可以用SAM解决。 我们先对第一个字符串构造SAM,然后和SPOJ1811一样用其他串和SAM进行匹配,只不过由于有多个串...
  • zzkksunboy
  • zzkksunboy
  • 2017年07月06日 18:16
  • 219
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LCS(Longest Common Substring)算法
举报原因:
原因补充:

(最多只允许输入30个字)