最长连续公共子数组,子串,本科001

2024-04-13 11:48

本文主要是介绍最长连续公共子数组,子串,本科001,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1、描述
    • 1.1公共子串,非连续
  • 2、关键字
  • 3、思路
  • 4、notes
  • 5、复杂度
  • 6、code

1、描述

718最长连续公共子串,
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。

示例:

输入:
A: [1,2,3,2,1]
B: [3,2,1,4,7]
输出:3
解释:
长度最长的公共子数组是 [3, 2, 1] 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1.1公共子串,非连续

的链接

2、关键字

最长,公共子串,连续

3、思路

经典dp,
按第一个串初始化第一行,遍历第一个串,与第二个串的首元素进行比较,如果相等就初始化为1,不等就初始化为0,
按第二个串初始化第一列,与第一个串的首元素比较,如果相等就初始化为1,不等就初始化为0,
然后两层循环遍历二维dp数组,把最大值搞出来输出就好了,

还有一个求两个字符串的最长公共子串,不要求连续,
只是不相等的时候当前值的处理不同,这个题是直接置0,而不连续的是取左边和上边的最大值,

相等的时候都是取左上元素+1

4、notes

连续

5、复杂度

时间O(NM)
空间O(N
M)

6、code

class Solution {
public:int findLength(vector<int>& A, vector<int>& B) {int res=0;int n=A.size();  // 列数int m=B.size();  // 行数res=(A[0]==B[0])?1:0;  // res初始化二维数组的第一行第一列 abc  agt vector<vector<int>>dp(m,vector<int>(n,0));for(int i=0;i<n;i++){  // 初始化第一行if(A[i]==B[0]){dp[0][i]=1;}}for(int j=0;j<m;j++){  // 初始化第一列if(A[0]==B[j]){dp[j][0]=1;}}for(int i=1;i<m;i++){  // 填充剩下的二维数组for(int j=1;j<n;j++){if(B[i]==A[j]){dp[i][j]=dp[i-1][j-1]+1;}else{dp[i][j]=0;}res=max(res,dp[i][j]);}}return res;}
};

这篇关于最长连续公共子数组,子串,本科001的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/900054

相关文章

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

poj2406(连续重复子串)

题意:判断串s是不是str^n,求str的最大长度。 解题思路:kmp可解,后缀数组的倍增算法超时。next[i]表示在第i位匹配失败后,自动跳转到next[i],所以1到next[n]这个串 等于 n-next[n]+1到n这个串。 代码如下; #include<iostream>#include<algorithm>#include<stdio.h>#include<math.

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring

spoj705( 求不相同的子串个数)

题意:求串s的不同子串的个数 解题思路:任何子串都是某个后缀的前缀,对n个后缀排序,求某个后缀的前缀的个数,减去height[i](第i个后缀与第i-1 个后缀有相同的height[i]个前缀)。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstrin

poj1330(LCA最近公共祖先)

题意:求最近公共祖先 思路:之前学习了树链剖分,然后我就用树链剖分的一小部分知识就可以解这个题目了,记录每个结点的fa和depth。然后查找时,每次将depth大的结点往上走直到x = y。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

XTU 1233 n个硬币连续m个正面个数(dp)

题面: Coins Problem Description: Duoxida buys a bottle of MaiDong from a vending machine and the machine give her n coins back. She places them in a line randomly showing head face or tail face o

hihocoder1050 : 树中的最长路

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中,小Ho发现他不仅仅可以拼凑成一棵二叉树!还可以拼凑成一棵多叉树——好吧,其实就是更为平常的树而已。 但是不管怎么说,小Ho喜爱的玩具又升级换代了,于是他更加爱不释手(其实说起来小球和木棍有什么好玩的是吧= =)。小Ho手

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ