思路:
从前往后扫描b数组,每次扫描一个数后,判断一下b的当前数是否和a的当前数一样,如果一样,就将a的当前数匹配到b的当前数。遍历完b数组后,如果发现a数组中每一个数,都顺次找到了和它匹配的数,就找到了一个b的子序列和a相等。
题目:
代码:
#include<iostream>
using namespace std;
const int N=1e6+10;
int a[N],b[N];
int n,m;
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)printf("Yes");
else printf("No");
return 0;
}
有关算法竞赛的题目会继续更新,欢迎评论交流!