求最长公共子串

来源:互联网 发布:cydia数据库损坏 编辑:程序博客网 时间:2024/05/17 07:57

题目:

给两个字符串,找出它们的最长的公共子串,跟求最长公共子序列不同,这个是求连续的。

思路:

动态规划。
dp[i][j]表示字符串a中[0~i]的子串,字符串b中[0~j]的子串,此时的最大长度。
如果a[i]==b[j],那么dp[i][j]=dp[i-1][j-1]+1;
如果a[i]不等于b[j],那么dp[i][j]=0。
变量end存放当前最长公共子串的最后一个元素的下标。
如果最大长度更新,说明end也要发送相应变化。

代码:

#include<iostream>#include<string>#include<stdio.h>#include<stdlib.h>#include<vector>using namespace std;string findLongestCommonSubstring(string a, string b){    int la = a.size();    int lb = b.size();    vector<vector<int>> dp(la+1,vector<int>(lb+1,0));    int maxLen = -1;    int end;    for (int i = 1; i <= la; i++){        for (int j = 1; j <= lb; j++){            if (a[i - 1] == b[j - 1]){                dp[i][j] = dp[i - 1][j - 1] + 1;            }            if (maxLen < dp[i][j]){                maxLen = dp[i][j];                end = i-1;            }        }    }    string str = a.substr(end-maxLen+1,maxLen);    return str;}int main(){    string a = "1AB2345CD";    string b = "12345EF";    string res=findLongestCommonSubstring(a, b);    cout << res;    system("pause");    return 0;}
0 0
原创粉丝点击