1 #include <iostream> 2 #include <vector> 3 #include <string> 4 using namespace std; 5 6 int main(int argc, char** argv) { 7 string t, a, b; 8 cin >> t; 9 // 输入字符串形为 "abcd;bcde", 以";"作为两个字符串的分隔, a,b两个字符串并不包含";" 10 int idx = t.find_first_of(';'); 11 a = t.substr(0, idx); 12 b = t.substr(idx+1); 13 int sizeA = a.size(), sizeB = b.size(); 14 vector<vector<int>> dp(sizeA + 1, vector<int>(sizeB + 1, 0)); 15 // dp[i][j] 表示a字符串的前i个字符与b字符串的前j个字符的最长公共子串的长度 16 int maxLen = 0, startPos = 0; 17 // maxLen 记录两个字符串的最长公共子串的长度, startPos 记录最长公共子串在b字符串中的起始位置 18 19 for(int i = 1; i <= sizeA; ++i) { 20 string temp; 21 for(int j = 1; j <= sizeB; ++j) { 22 if(a[i-1] == b[j-1]) { 23 dp[i][j] = dp[i-1][j-1] + 1; 24 if(dp[i][j] > maxLen) { 25 maxLen = dp[i][j]; 26 startPos = j - maxLen; 27 } 28 } 29 } 30 } 31 cout << maxLen << ' ' << b.substr(startPos, maxLen) << endl; 32 return 0; 33 }