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

博客内容讲述了在算法学习初期,作者遇到的一个关于数组匹配的问题。文章提供了两种不同的解题思路,一种是通过i和j指针遍历数组,另一种则是双指针法。在实现过程中,作者因忽视了基础概念导致了错误,最终修正后得出正确答案。文章强调了扎实的基础对算法学习的重要性。
摘要由CSDN通过智能技术生成

前言

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

思路

  • 通过 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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值