最长公共子串
题目
Description
给定两个字符串x = x1x2…xn
和y = y1y2…ym
, 请找出x
和y
的最长公共子串的长度,也就是求出一个最大的k
,使得存在下标i
和j
有xixi+1…xi+k-1 = yjyj+1…yj+k-1
.
x
和y
只含有小写字母,长度均在1和1000之间.
请为下面的Solution类实现解决上述问题的函数longestSubstring,函数的参数x和y为给出的两个单词,返回值为最长公共子串的长度.
class Solution {
public:
int longestSubstring(string x, string y) {
}
};
例1:x = “abcd”, y = “cdef”,返回值为2.
例2:x = “abcabc”, y = “xyz”,返回值为0.
例3:x = “introduction”, y = “introductive”,返回值为10.
解析
这道题使用动态规划解决
动态规划方程为
f(i,j)
表示表示字符串x
,y
分别以i
,j
为结尾的最长公共子字符串的长度。
f(i,j)={0f(i−1,j−1)x[i] != y[j]x[i] = y[j]
结果为 max1<=i<=n,1<=j<=m{f(i,j)}
解决
class Solution {
public:
int longestSubstring(string x, string y) {
int m = x.length();
int n = y.length();
if (!m || !n) {
return 0;
}
vector<int> dp(n + 1);
int result = 0;
for (int i = m - 1; i > -1; i--) {
for (int j = 0; j < n; j++) {
result = max(result, dp[j] = (x[i] == y[j]) ? 1 + dp[j + 1] : 0);
}
}
return result;
}
};