AcWing 2816. 判断子序列——算法基础课题解

AcWing 2816. 判断子序列

题目叙述

给定一个长度为 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

输入样例:

cpp 复制代码
3 5
1 3 5
1 2 3 4 5

输出样例:

cpp 复制代码
Yes

C++

cpp 复制代码
#include <iostream>

using namespace std;

const int N = 100010;

int n, m;

int a[N], b[N];

int main() {
    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]);

    int i = 0, j = 0;
    while (i < n && j < m) {
        if (a[i] == b[j]) i++;
        j++;
    }

    if (i == n) puts("Yes");
    else puts("No");

    return 0;
}

Go

go 复制代码
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	var n, m int
	reader := bufio.NewReader(os.Stdin)
	fmt.Fscanf(reader, "%d %d\n", &n, &m)
	a, b := make([]int, n), make([]int, m)
	for i := 0; i < n; i++ {
		fmt.Fscanf(reader, "%d", &a[i])
	}
	fmt.Fscanf(reader, "\n")
	for i := 0; i < m; i++ {
		fmt.Fscanf(reader, "%d", &b[i])
	}
	i, j := 0, 0
	for i < n && j < m {
		if a[i] == b[j] {
			i++
		}
		j++
	}
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()
	if i == n {
		fmt.Fprintln(writer, "Yes")
	} else {
		fmt.Fprintln(writer, "No")
	}
}
go 复制代码
package main

import (
	"bufio"
	"os"
	"strconv"
	"strings"
)

func main() {
	var n, m int
	reader := bufio.NewReader(os.Stdin)
	line, _ := reader.ReadString('\n')
	params := strings.Fields(line)
	n, _ = strconv.Atoi(params[0])
	m, _ = strconv.Atoi(params[1])
	a := make([]int64, n)
	b := make([]int64, m)
	line, _ = reader.ReadString('\n')
	nums := strings.Fields(line)
	for i := 0; i < n; i++ {
		a[i], _ = strconv.ParseInt(nums[i], 10, 64)
	}
	line, _ = reader.ReadString('\n')
	nums = strings.Fields(line)
	for i := 0; i < m; i++ {
		b[i], _ = strconv.ParseInt(nums[i], 10, 64)
	}
	i, j := 0, 0
	for i < n && j < m {
		if a[i] == b[j] {
			i++
		}
		j++
	}
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()
	if i == n {
		writer.WriteString("Yes\n")
	} else {
		writer.WriteString("No\n")
	}
}
相关推荐
倒头就睡的小比特5 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
晨米酱5 天前
AGENTS.md:Agent 的上下文策略层
面试·架构·agent
猎头南楼5 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光5 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark5 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her15 天前
并查集-听课笔记
笔记·算法·并查集
码流子5 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
彧azz5 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
another heaven5 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法