acwing 判断子序列
题目
给定一个长度为 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
−109≤ai,bi≤109
输入样例:
3 5
1 3 5
1 2 3 4 5
输出样例:
Yes
题解
分析
- 使用双指针,o为数组1的指针,p为数组2的指针
- 因为数组2要比数组1大,所以使p每次循环自增,当有相同值,使o自增,最后检查o是否已经遍历完毕即可
代码
#include "iostream"
using namespace std;
const int N=100010;
int num[N]={0};
int num2[N]={0};
int main(){
int n1,n2;
cin>>n1>>n2;
for(int i=0;i<n1;i++){
cin>>num[i];
}
for(int i=0;i<n2;i++){
cin>>num2[i];
}
int o=0,p=0;
for(;p<n2&&o<n1;p++){
if(num[o]==num2[p])o++;
}
if(o==n1)cout<<"Yes";
else cout<<"No";
}