最大公共子串
有两个字符串,这两个字符串可能会存在公共的部分,如字符串"abcdef" 和字符串"defg",这两个字符串之间有共同的字符串,“d”,“e”,“f”,“de”,“ef”,“def” 等。最长的公共子串就是"def"。
思路:
- LCS[i][j] = 0 (i<0||j<0)
- LCS[i][j] = LCS[i-1][j-1)]+1 (i>=0 && b>0 && (str1[i]==str2[j]))
解法:LCS (Longest Common Subsequence) 算法
#include <string>
#include <vector>
#include <iostream>
using namespace std;
string getLongestMatchedString(string& s1, string& s2) {
string ret = "";
if (!s1.size() || !s2.size()) return ret;
const int M = s1.size();
const int N = s2.size();
int imax = 0, istart = 0;
int **a = new int*[M]; // M * N
for(int i = 0; i < M; i++) {
a[i] = new int[N];
}
for (int j = 0; j < N; j++) {
for(int i = 0; i < M; i++) {
if( s1[i] == s2[j]) {
if ( i >=1 && j >= 1) {
a[i][j] = a[i-1][j-1] + 1;
if (a[i][j] > imax) {
imax = a[i][j];
istart = i;
}
}
else {
a[i][j] = 1;
}
}
else a[i][j] = 0;
cout << a[i][j] << ", ";
}
cout <<endl;
}
for(int i = 0; i < N; i++) {
delete a[i];
}
delete [] a;
return s1.substr(istart - imax + 1, imax);
}
int main() {
string s1("sadlfjoeertyuiosfsd");
string s2("ascsjertyuis");
string ret = getLongestMatchedString(s1, s2);
cout << ret << endl;
return 0;
}