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),蛮好蛮好

相关文章推荐

SPOJ LCS Longest Common Substring 后缀自动机

题目大意: 就是现在给你两个长度不超过25*10^4的串, 求他们的最长公共子串的长度 大致思路: 第一道后缀自动机的题... 居然套模板一发过了.... 我的想法就是原本后缀自动机...

SPOJ - LCS2 Longest Common Substring II 后缀自动机

题意:给出n(n

SPOJ - LCS Longest Common Substring 后缀自动机

题意:求两个字符串的最长公共子串。 后缀自动机 看了很久 WJMZBMR 讲后缀自动机的ppt才大致把后缀自动机搞懂^_^, 此外附上两个比较好的讲后缀自动机的博客 后缀自动机 模版,后缀自动机讲解 ...

spoj LCS2 Longest Common Substring II

后缀自动机
  • sdfzyhx
  • sdfzyhx
  • 2017年03月29日 11:29
  • 99

spoj1811 Longest Common Substring(LCS),后缀自动机

spoj1811LCS 问两个字符串最长公共子串。 做法很简单。匹配成功,则tl++,失败,从父指针回退,tl=t[now].len。 从这题可以清楚了解后缀自动机fa指针的性质: 指向一个状态...

SPOJ LCS2 Longest Common Substring II

Description A string is finite sequence of characters over a non-empty finite set Σ. In this p...

【后缀自动机】[SPOJ LCS]Longest Common Substring

模板题目,感觉和用AC自动机差不多,就是一个一个字符在自动机里面匹配,找不到就沿着失配边往上走,然后如果当前节点变成了null那么就不能继续匹配,就把当前设置成root然后len变成0,否则就沿着边继...

spoj 1812 LCS2 - Longest Common Substring II (后缀自动机)

spoj 1812 LCS2 - Longest Common Substring II 题意: 给出最多n个字符串A[1], ..., A[n], 求这n个字符串的最长公共子串。 限制...
  • whai362
  • whai362
  • 2015年08月14日 20:50
  • 693

SPOJ - 1811 LCS - Longest Common Substring

SPOJ - 1812 LCS - Longest Common Substring(后缀自动机、LCS)

[SPOJ1812]LCS2 - Longest Common Substring II

后缀自动机
  • hbhcy98
  • hbhcy98
  • 2016年04月04日 16:21
  • 323
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LCS(Longest Common Substring)算法
举报原因:
原因补充:

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