判断子序列
思路分析
$a$是子字符串,$b$是原字符串
我们可以从前往后依次从从$b$里面找,当可以匹配$a$中的一个字符时候,我们就取匹配下一个
这样匹配出来的是$b$中,最先和$a$匹配的子串
每次$j$都要往后走
匹配可以是多种的,这样一定能找出来最先匹配的
代码
#include <iostream>
#include <cstring>
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是b中第一个与a[i]匹配的字符,找到后在b串中找a[i + 1]
j ++ ;//b串的字符匹配完,都要向后走
}
if (i == n) puts("Yes");
else puts("No");
return 0;
}