[Acwing] 双指针 2816. 判断子序列

目录

  • 前言
  • 思路
  • code:
  • 错误的思路

前言

基础 不打牢 今朝见鬼神(我是牛马 呜呜呜)

思路

  • 通过 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 
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<

        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"<


}
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;

你可能感兴趣的:(#,双指针)