题目链接 : 点击查看
题目描述 :
给定一个长度为 n 的整数序列 a1,a2,…,an 以及一个长度为 m 的整数序列 b1,b2,…,bm,请你判断 a 序列是否为 b 序列的子序列。子序列指序列的一部分项按原有次序排列而得的序列,例如序列 {a1,a3,a5} 是序列 {a1,a2,a3,a4,a5} 的一个子序列。
输入输出 :
输入
3 5
1 3 5
1 2 3 4 5
输出
Yes
题目分析 :
本题是判断a序列是否是b的子序列,我们可以完全忽视a ,b序列长度大小,当然若a的序列长度大于b的长度,则a不可能是b的子序列。对于此题,我们可以用双指针算法,i,j分别模拟指向数组a, b左端的指针,然后将数组a中的数字依次与b中数字进行匹配,在匹配过程中,我们以a数组为主体,每一次循环都将 j ++(向右移动一位),而当b中当前位置数字与a中数字匹配(相等)时,才将 i ++(向下移动一位)。如果最后循环结束时,如果 i 已经到了a数组末端,则为b的子序列否则不是,这里主要对a进行考量,所以我们说不用考虑a, b序列谁长谁短。
代码 :
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 1e5 + 7;
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, j = 0;
while (i < n && j < m) {
if (a[i] == b[j]) i ++ ;
j ++ ;
}
if (i == n) cout << "Yes";
else cout << "No";
return 0;
}