首页 > 其他分享 >判断子序列(双指针)

判断子序列(双指针)

时间:2023-11-22 09:11:41浏览次数:38  
标签:判断 int 遍历 数组 序列 指针

一、题目来源

AcWing算法基础课-2816.判断子序列

二、题目描述

给定一个长度为 \(n\) 的整数序列 \(a_1,a_2,…,a_n\) 以及一个长度为 \(m\) 的整数序列 \(b_1,b_2,…,b_m\)。

请你判断 \(a\) 序列是否为 \(b\) 序列的子序列。

子序列指序列的一部分项按原有次序排列而得的序列,例如序列 {\(a_1,a_3,a_5\)} 是序列 {\(a_1,a_2,a_3,a_4,a_5\)} 的一个子序列。

输入格式

第一行包含两个整数 \(n,m\)。

第二行包含 \(n\) 个整数,表示 \(a_1,a_2,…,a_n\)。

第三行包含 \(m\) 个整数,表示 \(b_1,b_2,…,b_m\)。

输出格式

如果 \(a\) 序列是 \(b\) 序列的子序列,输出一行 Yes

否则,输出 No

数据范围

\(1≤n≤m≤10^5,\)
\(−10^9≤a_i,b_i≤10^9\)

输入样例:

3 5
1 3 5
1 2 3 4 5 

输出样例:

Yes 

三、算法思路

本题比较简单,使用双指针解决问题。

思路如下:

  1. \(i\) 指针从 \(a\) 数组开始枚举, \(j\) 指针从 \(b\) 数组开始枚举。

  2. 遇到 \(a[i] == b[j]\) 则 \(i\) 指针右移。

  3. 只要 \(a\) 数组和 \(b\) 数组都没有遍历完,那么一直遍历下去。

  4. 最后如果左指针 \(i == n\) ,则说明是子序列,如果没到 \(n\) ,则不是子序列。

  • 两个数组都只会遍历一遍,所以时间复杂度为 \(O(m + n)\)。
  • 为什么第三步要加一个判断,判断 \(a\) 数组有没有被遍历完呢?因为可能出现一下这种结果,\(a\) 数组是 \(1\) , \(b\) 数组是 \(1\) \(0\),已经匹配完了之后 \(i\) 指针还会继续往下走,如果后面的判断是 \(i == n\) ,那么就会出现问题。
  • 也可以修改后面的判断为 \(i >= n\) ,这样也可以忽略前面的有没有遍历完的问题。

四、源代码

#include <iostream>

using namespace std;

const int N = 100010;

int n, m;
int a[N], b[N];

int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; ++i) cin >> a[i];
    for (int i = 0; i < m; ++i) cin >> b[i];
    
    int i = 0;
    for (int j = 0; j < m; ++j)
        if (i < n && a[i] == b[j])		//如果这里不加 i < n,则后面的判断条件应修改为 i >= n
            ++ i;
            
    if (i == n) puts("Yes");
    else    puts("No");
    
    return 0;
}

标签:判断,int,遍历,数组,序列,指针
From: https://www.cnblogs.com/grave-master/p/17847832.html

相关文章

  • 数组元素的目标和(双指针)
    一、题目来源AcWing算法基础课-800.数组元素的目标和二、题目描述给定两个升序排序的有序数组\(A\)和\(B\),以及一个目标值\(x\)。数组下标从\(0\)开始。请你求出满足\(A[i]+B[j]=x\)的数对\((i,j)\)。数据保证有唯一解。输入格式第一行包含三个整数\(n,m,......
  • 最长连续不重复子序列(双指针)
    一、算法描述含义双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。另外还可以根据序列进行区分,例如在快排中,双指针指向的是同一个序列,而归并排序中两个指针指向的是两个......
  • 汇编-PTR指针
            ......
  • 金蝶云星空其他出库单保存提示序列号不一致
    一、保存报错显示单据数量=0.序列号数量=3 二、初步分析输入实发数量没有触发序列号数量的计算检查实发数量的值更新事件 实发数量和序列号数量的转换,必须保证,基本单位和序列号单位的关系,两者且不能为空 三、总结界面效果,输入实发数量,自动根据单位计算序列号的数量,......
  • 【Django进阶】django-rest-framework中文文档——序列化器
    搭建环境使用django-rest-framework中文文档——快速入门中的虚拟环境。新建snippets应用程序python.\manage.pystartappsnippets注册相关应用程序,例如当前应用,rest_framework创建数据库模型编辑snippets/models.py文件fromdjango.dbimportmodelsfrompygments.le......
  • P1241 括号序列
    P1241括号序列RE一半#include<iostream>#include<algorithm>#include<cstdio>#include<stack>usingnamespacestd;strings;charans[400];boolvis[400];intcnt=0;stack<pair<int,char>>sta;boolcheck(charch1,char......
  • 关于AssetBundle禁用TypeTree之后的一些可序列化的问题
    1)关于AssetBundle禁用TypeTree之后的一些可序列化的问题2)启动Unity导入变动的资源时,SingletonScriptableObject 加载不到3)Xcode15构建Unity2022.3的Xcode工程,报错没有兼容的iPhoneSDK这是第361篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术......
  • 判断字符串是否只含有数字
    判断字符串是否只含有数字使用commons.lang包工具类importorg.apache.commons.lang3.StringUtils;StringUtils.isNumeric(tmpStr)底层实现判断每一个字符是否是数字publicstaticbooleanisNumeric(finalCharSequencecs){if(isEmpty(cs)){re......
  • jquery 检测div宽度变化_jquery判断浏览器宽度小于指定值改变div样式
    浏览器原本样式当浏览器宽度小于1200px时样式变为代码如下:方法一:直接修改该div样式添加w1200,会覆盖前一个样式$(function(){var_width=$(window).width();//获取浏览器宽度if(_width<1200){$(".chenbin_org").addClass("w1200");}});方法二:修改该div的class属性......
  • java向 jni传递问文件指针
    1、创建fd,jni接口publicstaticnativeintopenFileFromNative(FileDescriptorfileDescriptor);2、java文件获取文件指针ParcelFileDescriptorpfd==getContentResolver().openFileDescriptor(filePathUri,"rw");FileDescriptorfd=pfd.getFileDescriptor()......