前言
基础 不打牢 今朝见鬼神(我是牛马 呜呜呜)
思路
- 通过 i 指针循环一遍 b 数组
- 然后通过 j (j = 1) 遍历 a 数组
- 当且 仅当 (j<=n 且 a[j] == b[i]) 的时候 j++
j<=n 是避免 重复跳动 j++
(最后就是 控制输出 因为 j从一开始 所以输出的时候 需要用 n+1 判断 )
总所周知 1+2 =3 而不是 1+2 = 2
code:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int a[N],b[N],n,m;
void solve()
{
cin>>n>>m;
for(int i=1; i<=n; i++)
cin>>a[i];
for(int i=1; i<=m; i++)
cin>>b[i];
int j = 1;
for(int i = 1; i<=m; i++)
{
// cout<<i<<" "<<b[i]<<" "<<a[j]<<endl;
if(j<=n && b[i] == a[j])
{
j++;
continue;
}
}
if(j == n+1)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
/** int l = 1;
int r = n;
for(int i=1, j = m;i<=j;i++,j--)
{
if(b[i] == a[l])
l++;
if(b[j] == a[r])
r--;
}
if(abs(l-r)+1 == n)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;*/
}
int main()
{
solve();
return 0;
}
错误的思路
送给一些人的话 因为在刚刚入门算法的时候
总感觉acwing 讲的 太多用不到了
(因为 预先做了 牛客 和 cf 以及at的题 就感觉 都是思维题 所以就没怎么 认真对待基础)
所以呢
我在做这题的时候 在输出的时候又以为是规律输出了emm
就这样 喜提1WA
(我就知道这个做法是错的 但是 我就是硬着头皮教了 都是cf 呜呜呜)
int l = 1;
int r = n;
for(int i=1, j = m;i<=j;i++,j--)
{
if(b[i] == a[l])
l++;
if(b[j] == a[r])
r--;
}
if(abs(l-r)+1 == n)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;