判断子序列(双指针)
一、题目来源
二、题目描述
给定一个长度为
请你判断
子序列指序列的一部分项按原有次序排列而得的序列,例如序列 {
输入格式
第一行包含两个整数
第二行包含
第三行包含
输出格式
如果 Yes
。
否则,输出 No
。
数据范围
输入样例:
3 5
1 3 5
1 2 3 4 5
输出样例:
Yes
三、算法思路
本题比较简单,使用双指针解决问题。
思路如下:
-
指针从 数组开始枚举, 指针从 数组开始枚举。 -
遇到
则 指针右移。 -
只要
数组和 数组都没有遍历完,那么一直遍历下去。 -
最后如果左指针
,则说明是子序列,如果没到 ,则不是子序列。
- 两个数组都只会遍历一遍,所以时间复杂度为
。 - 为什么第三步要加一个判断,判断
数组有没有被遍历完呢?因为可能出现一下这种结果, 数组是 , 数组是 ,已经匹配完了之后 指针还会继续往下走,如果后面的判断是 ,那么就会出现问题。 - 也可以修改后面的判断为
,这样也可以忽略前面的有没有遍历完的问题。
四、源代码
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)