题目地址:力扣
题目难度:Medium
涉及知识点:动态规划、滑动窗口
分析:若把题目中的数组换成字符串,那么这道题就变成了最长公共子串问题。与最长公共子序列不同,子串要必须连续。
解法1:暴力求解
思路:先固定第一个数组的值遍历第二个数组,若发现比较的两个元素相等,则使用临时变量来一起往后看,看最长多少位相等,更新全局最大解;再继续遍历第一个数组的值,直到遍历不可能再出现更长的为止。
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
// 定义数组大小以及全局最大解
int sz1 = nums1.size(), sz2 = nums2.size();
int max_len = 0;
// 遍历数组1,当发现后面剩下的元素不足以超过最大值的时候就跳出循环
for (int i = 0; i < sz1-max_len; ++i)
{
// 遍历数组2
for (int j = 0; j < sz2; ++j)
{
// 若当前元素相等
if (nums1[i] == nums2[j]) {
int cur_len = 0;
int tmp1 = i, tmp2 = j;
// 则一起往后看最高有多少位相等
while (tmp1 != sz1 && tmp2 != sz2 && nums1[tmp1] == nums2[tmp2])
{
++cur_len, ++tmp1, ++tmp2;
}