双指针算法
1.j
指针用来扫描整个b
数组,i
指针用来扫描a
数组。若发现a[i] == b[j]
,则让i
指针后移一位。
2.整个过程中,j
指针不断后移,而i
指针只有当匹配成功时才后移一位,若最后若i == n
,则说明匹配成功。
为什么双指针做法是正确的?
整个过程中j
指针不断扫描b
数组并且向后移动,相当于不断给i
指针所指向的a
数组创建匹配的机会,只有匹配成功时i
指针才会向后移动一位,当i == n
时,说明全部匹配成功。
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e5+10;
int a[N],b[N];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i = 0;i < n; i++) scanf("%d",&a[i]);
for(int j = 0;j < m; j++) scanf("%d",&b[j]);
int i = 0;
for(int j = 0;j < m; j++)
{
if(i < n&&a[i] == b[j]) i++;
}
if(i == n) puts("Yes");
else puts("No");
return 0;
}
#简洁还好理解,大佬的思维就是厉害!
一个月前就做到这了,大佬厉害
我现在都卡在数论了555
怎么样才能向大佬一样写这么通俗易懂的题解呀
只要能够按顺序匹配到,字符串前边的匹配任务就完成了
大佬牛逼我思路差不多但就是写不出来这么简洁的
大佬nb
牛啊牛啊
写的真的太厉害了
一下子就看懂了,谢谢大佬
if(i < n&&a[i] == b[j]) i; 改成 while(i < n&&a[i] == b[j]) i; 答案会不一样 有大佬能指点一下吗
用while的话i执行完,会再次进入while循环进行判断,而不是执行j
大佬啊
太优雅了
#include [HTML_REMOVED]
using namespace std;
#define int long long
#define endl ‘\n’
const int inf = 0x3f3f3f3f;
const int N=1e5+10;
int a[N],b[N],n,m,flag;
void oper()
{
cin>>n>>m;
for(int i=1;i<=n;i)cin>>a[i];for(int i=1;i<=m;i)cin>>b[i];
}
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1; //cin >> t;
while(t–)
oper();
}
我的代码是相当丑陋了
大佬牛逼!!!
大佬真的好简洁,羡慕tql
我从i开始的qwq,不过算了下时间复杂度也是O(m+n),中间加了点条件提前结束,判断一下后面长度够不够
厉害
这道题是不是类似于动态规划中的最短编辑距离呢
其实还可以优化,在for里面再增加对i==n的判断在某些情况下可以提前跳出循环
又是你
tql