(字符串)最长公共字串(Longest-Common-SubString,LCS)

题目:

给定两个字符串X,Y,求二者最长的公共子串,例如X=[aaaba],Y=[abaa]。二者的最长公共子串为[aba],长度为3。

子序列是不要求连续的,字串必须是连续的。

思路:

1、简单思想:

遍历两个字符串X、Y,分别比较X的字串与Y的字串,求出最长的公共字串。

#include <iostream>
#include <vector>

using namespace std;

int getComLen(char *str1,char *str2){
    int len=0;
    while(*str1 && *str2){
        if(*(str1++)==*(str2++))
            len++;
    }
    return len;
}

int LCS1(char *str1,int len1,char *str2,int len2){
    int maxlen=0;
    int maxIndex=0;
    int len;
    for(int i=0;i<len1;i++){
        for(int j=0;j<len2;j++){
            len=getComLen(str1+i,str2+j);
            if(len>maxlen){
                maxlen=len;
                maxIndex=i;
            }
        }
    }
    cout<<"Length of Longest Common Substring: "<<maxlen<<endl;
    cout<<"Index of LCS is: ";
    for(int i=maxIndex;i<maxIndex+maxlen;i++)
        cout<<str1[i];
    cout<<endl;
    return maxlen;
}

// dynamic programming
int LCS2(char *str1,int len1,char *str2,int len2){
    vector<vector<int> > dp(len1+1,vector<int>(len2+1,0));
    int maxlen=0;
    int maxIndex;
    for(int i=0;i<=len1;i++){
        for(int j=0;j<=len2;j++){
            if(i==0 || j==0)
                dp[i][j]=0;
            else{
                if(str1[i-1]==str2[j-1])
                    dp[i][j]=dp[i-1][j-1]+1;
            }
            if(dp[i][j]>maxlen){
                maxlen=dp[i][j];
                maxIndex=i-maxlen+1;
            }
        }
    }
    cout<<"Length of Longest Common Substring: "<<maxlen<<endl;
    cout<<"Index of LCS is: ";
    for(int i=maxIndex-1;i<maxIndex-1+maxlen;i++)
        cout<<str1[i];
    cout<<endl;
    return maxlen;
}

int main()
{
    char str1[]="Chinese";
    char str2[]="Chienglish";
    int len1=sizeof(str1)/sizeof(str1[0])-1;
    int len2=sizeof(str2)/sizeof(str2[0])-1;
    cout << LCS1(str1,len1,str2,len2) << endl;
    return 0;
}
时间: 2024-10-13 12:13:17

(字符串)最长公共字串(Longest-Common-SubString,LCS)的相关文章

最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr

问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列<i0,i1,…,ik-1>,使得对所有的j=0,1,…,k-1,有xij=yj.例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列. 考虑最长公共子序列问题如何分解成子问题,设A=“a0,a1,…,am-1”,B=“b0,b1,…,bm

动态规划 ---- 最长公共子序列(Longest Common Subsequence, LCS)

分析: 完整代码: // 最长公共子序列 #include <stdio.h> #include <algorithm> using namespace std; const int N = 100; char A[N], B[N]; int dp[N][N]; int main() { freopen("in.txt", "r", stdin); int n; gets(A + 1); // 从下标1开始读入 gets(B + 1); in

搜索里的相似度计算-最长公共字串

相似度计算的任务是根据两段输入文本的相似度返回从0到1之间的相似度值:完全不相似,则返回0,:完全相同,返回1.衡量两端文字距离的常用方法有:海明距离(Hamming distance),编辑距离,欧氏距离,文档向量的夹角余弦距离,最长公共字串. 1. 余弦相似度 把两篇文档看作是词的向量,如果x,y为两篇文档的向量,则:Cos(x, y) = (x * y) / (||x|| * ||y||) 使用Hashmap可以很方便的把这个计算出来 2. 最长公共字串(Longest Common Su

最长递归子序列、最长公共字串、最长公共子序列、编辑距离

[TOC]   ### 最长递归子序列 #### 题目 给定数组arr,返回arr中的最长递增子序列,如`arr=[2,1,5,3,6,4,8,9,7]`,返回的最长递增子序列为`[1,3,4,8,9]` #### 题解思路 先用DP来求解子序列递增的最大长度,如arr的长度序列为`dp=[1,1,2,2,3,3,4,5,4]`,然后对这个长度序列dp从右到左遍历,得到最长递增子序列. 1. 求解长度序列,令dp[i]表示在以arr[i]这个数结尾的情况下,arr[0...i]中的最大递增子序列

【编程题目】最长公共字串

56.最长公共字串(算法.字符串).题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串.注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中.请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串.例如:输入两个字符串 BDCABA 和 ABCBDAB,字符串 BCBA 和 BDAB 都是是它们的最长公共子串,则输出它们的长度 4,并打印任意一个子串. 经典动态规划题. #include <stdio.h> #i

URAL 1517 Freedom of Choice(后缀数组,最长公共字串)

题目 输出最长公共字串 #define maxn 200010 int wa[maxn],wb[maxn],wv[maxn],ws[maxn]; int cmp(int *r,int a,int b,int l) {return r[a]==r[b]&&r[a+l]==r[b+l];}//yuan lai zhi qian ba zhe li de l cuo dang cheng 1 le ... void da(int *r,int *sa,int n,int m) { int i,j

最长公共子序列与最长公共字串

显然最长公共子序列不一定需要连续的,只要字符的顺序严格递增即可.最长公共字串需要字符连续 子序列代码: package test; import java.util.*; /* * 本题是求最长公共子序列,子序列未必连续,只需要严格递增即可 * 如 abcdeeeeeeeee和atttbggcd 最长公共子序列为abcd 长度为4 * * */ public class Main4{ public static void main(String... args){ try(Scanner in

Longest Common Substring($LCS$)

Longest Common Substring(\(LCS\)) 什么是子序列? 子序列就是某一个序列的不连续的一部分. 如图, \(abcde\)就是图中序列的一个子序列. 公共子序列 公共子序列的定义就是两个序列共有的子序列啦. qwq 一些题目就会要求我们求两个序列的最长公共子序列. 如果直接去两两比对的话,复杂度爆炸! 所以介绍\(O(n\times m)\)做法. \(Dp\) 我们设\(f[i][j]\)代表从到达\(a\)串第\(i\)个位置,\(b\)串第\(j\)个位置的最长

lintcode_79最长公共字串

给出两个字符串,找到最长公共子串,并返回其长度. 样例 给出A="ABCD",B="CBCE",返回 2 class Solution: """ @param: A: A string @param: B: A string @return: the length of the longest common substring. """ def longestCommonSubstring(self, A,