先看问题描述
给定两个整数型数组,要求找出相等的最长子串的长度。特别的,将数组长度限制在了1-1000,且数组元素限制在了0-100
本体采用了动态规划的算法,从最短相同子串慢慢累积到最长相同子串,每一个更长子串都是基于上一次较短子串获得的。
这里定义一个数组C[i][j]记录以给定数组A[i]和B[j]结尾的相同子串长度,也就是说,如果A[i] 和B[j]不相同,则相同子串在此处已经完结,如果相同,则它是在上一个状态的基础上加一,即C[i - 1][j - 1] + 1。
因此可得计算式
C[i][j]=(A[i]==B[j]?C[i−1][j−1]+1:0);
每次获得新的C[i][j],与当前遇到最大值比较,最后返回最大值即可。
代码如下:
int findLength(vector<int>& A, vector<int>& B) {
vector<vector<int> > C(A.size() + 1, vector<int>(B.size() + 1, 0));
int result = 0;
for (int i = 1; i < A.size() + 1; ++i) {
for (int j = 1; j < B.size() + 1; ++j) {
if (A[i - 1] == B[j - 1]) {
C[i][j] = C[i - 1][j - 1] + 1;
}
result = result > C[i][j] ? result : C[i][j];
}
}
return result;
}
牵扯两层循环,复杂度为O(len(A)len(B))