两个字符串的最长公共子串 (动态规划 + 记录起始位置)

 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 }

 

上一篇:leetcode5964. 执行所有后缀指令(mid)(273周赛)


下一篇:快速入门百度Ai(java向)