提交时间:2026-06-14 14:12:23
运行 ID: 91651
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; int main() { string x, y; getline(cin, x); getline(cin, y); // 去掉第一个标识字符,取有效部分 string s1 = x.substr(1); string s2 = y.substr(1); int len1 = s1.size(); int len2 = s2.size(); int maxLen = 0; int endPos = 0; // 记录s1中最长子串的结束下标 // dp数组:dp[i][j] 表示 s1前i位、s2前j位 结尾的最长公共子串长度 vector<vector<int>> dp(len1 + 1, vector<int>(len2 + 1, 0)); for (int i = 1; i <= len1; ++i) { for (int j = 1; j <= len2; ++j) { if (s1[i - 1] == s2[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1; // 更新最大值与结束位置 if (dp[i][j] > maxLen) { maxLen = dp[i][j]; endPos = i - 1; } } else { dp[i][j] = 0; } } } // 截取最长公共子串 string res = s1.substr(endPos - maxLen + 1, maxLen); cout << maxLen << endl; cout << res << endl; return 0; }