题目描述
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。OJ链接
示例:
输入:
abcdefghijklmnop
abcsafjklmnopqrstuvw
输出:
jklmnop
解析
这道题用动态规划求解比较方便,定义MCS[i][j]记录短字符串 s1 前 i 个字符和长字符串 s2 前 j 个字符的最长子串的长度,初始化所有值为 0。当 s1[i-1] = s2[j-1]时MCS[i][j] = MCS[i - 1][j - 1] + 1,这里使用一个额外的值start 来记录最长子串在短字符串 s1 中出现的起始位置,maxlen记录当前最长子串的长度,当MCS[i][j] >maxlen 时,maxlen = MCS[i][j], 则start = i - maxlen ;档s1[i-1] != s2[j-1]时不需要任何操作,最后获取substr(start, maxlen)即为所求。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
<