-
本题提供两种写法,第二种写法更为优雅简洁。
-
当然为了避免“不严谨”,法一也可以在进入 while 循环前判断 j 是否大于 m,但是毕竟 j 不会超过 b 数组的范围,实际上是 绝对安全 的,而且如果额外判断则有代码重复的累赘感,所以姑且这样写。
写法一
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int n, m;
int a[N], b[N];
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++) cin >> a[i];
for (int i = 1; i <= m; i ++) cin >> b[i];
// 为什么需要j++?因为a[i-1]与a[j-1]匹配成功后,随着i往后移动一位,j也应该向后移动一位
for (int i = 1, j = 1; i <= n; i ++, j ++)
{
// 其实不够严谨,当for(;;)中的j自增后,j有可能超过m,虽然b数组开的范围比m要大10,可以避免越界,但仍然有不严谨的嫌疑
while (b[j] != a[i])
{
j ++ ;
if (j > m)
{
cout << "No";
return 0;
}
}
}
cout << "Yes";
return 0;
}
写法二:
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int n, m;
int a[N], b[N];
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++) cin >> a[i];
for (int i = 1; i <= m; i ++) cin >> b[i];
int i = 1, j = 1;
while (i <= n && j <= m)
{
if (a[i] == b[j]) i ++;
j ++;
}
i == n + 1 ? cout << "Yes" : cout << "No";
return 0;
}