算法刷题笔记 判断子序列(C++实现)

文章目录

题目描述

  • 给定一个长度为n的整数序列a1,a2,...,an以及一个长度为m的整数序列b1,b2,...,bm。请你判断a序列是否为b序列的子序列。
  • 子序列指序列的一部分项按原有次序排列而得的序列,例如序列{a1,a3,a5}是序列{a1,a2,a3,a4,a5}的一个子序列。

输入格式

  • 第一行包含两个整数n,m
  • 第二行包含n个整数,表示a1,a2,...,an
  • 第三行包含m个整数,表示b1,b2,...,bm

输出格式

  • 如果a序列是b序列的子序列,输出一行Yes。否则,输出No

数据范围

  • 1 ≤ n ≤ m ≤10^5,
  • −10^9 ≤ ai,bi ≤ 10^9

基本思路

  • 输入方面,首先是两个整数,整数的最大值为十万,因此可以使用基本整型int来进行表示。接着输入两个数组,数组中元素的最大值为十亿,因此仍然可以通过基本整型int来进行表示。所以,最终可以通过创建两个单元数为100010的整型数组分别记录ab
  • 输出方面,只需要判定a数组是不是b数组的子序列即可。
  • 过程处理方面,只需要按照a数组中的元素顺序,从前到后遍历b数组,检查其中是否存在这样一个序列即可,较为简单。

实现代码

cpp 复制代码
#include <cstdio>

const int N = 100010;
int a[N], b[N];

bool is_son(const int &n, const int &m)
{
    int ap, bp;
    for(bp = 0, ap = 0; bp < m && ap != n; ++bp) if(b[bp] == a[ap]) ap++;
    if(ap == n) return true;
    else return false;
}

int main(void)
{
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; ++i) scanf("%d", &a[i]);
    for(int i = 0; i < m; ++i) scanf("%d", &b[i]);
    if(is_son(n, m)) printf("Yes");
    else printf("No");
    return 0;
}
相关推荐
爱coding的橙子1 小时前
每日算法刷题 Day3 5.11:leetcode数组2道题,用时1h(有点慢)
算法·leetcode
虾球xz3 小时前
游戏引擎学习第268天:合并调试链表与分组
c++·学习·链表·游戏引擎
fpcc3 小时前
跟我学c++高级篇——模板元编程之十三处理逻辑
c++
格林威4 小时前
Baumer工业相机堡盟工业相机的工业视觉中为什么偏爱“黑白相机”
开发语言·c++·人工智能·数码相机·计算机视觉
song_ly0014 小时前
深入理解软件测试覆盖率:从概念到实践
笔记·学习·测试
DIY机器人工房5 小时前
[6-2] 定时器定时中断&定时器外部时钟 江协科技学习笔记(41个知识点)
笔记·stm32·单片机·学习·江协科技
Dream it possible!5 小时前
LeetCode 热题 100_只出现一次的数字(96_136_简单_C++)(哈希表;哈希集合;排序+遍历;位运算)
c++·leetcode·位运算·哈希表·哈希集合
?abc!6 小时前
缓存(5):常见 缓存数据淘汰算法/缓存清空策略
java·算法·缓存
BioRunYiXue6 小时前
一文了解氨基酸的分类、代谢和应用
人工智能·深度学习·算法·机器学习·分类·数据挖掘·代谢组学
DanB246 小时前
Java笔记4
java·开发语言·笔记