$\Huge\color{orchid}{点击此处获取更多干货}$
双指针
既然算法名叫“双指针”,那么本篇将回归原始,使用“指针”来解决问题。
同样是一个很好理解的问题,要判断a是否为b的子序列,只需要判断是否可以将a序列的每一个元素按照顺序与b序列中的元素一一匹配。这一对指针$(pa, pb)$分别指向a,b的首地址,每次循环时,将pa和pb所指元素比较,如果相等的话pa后移,不相等则pa不动,比较完成后pb是一定要后移的。如果在比较结束后发现pa已经后移到出界,就说明a序列中的每一个元素都按顺序匹配了b序列中的一些字符,就说明a是b的子序列了
C语言 代码
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, m;
scanf("%d%d", &n, &m);
//a是模式串,b是主串
int *a = (int*)malloc(sizeof(int) * n),
*b = (int*)malloc(sizeof(int) * m);
for(int i = 0; i < n; i++) {
//&a[i]就是a+i,scanf需要获得输入的地址,而数组名就是数组首地址
scanf("%d", a + i);
}
for(int j = 0; j < m; j++) {
scanf("%d", b + j);
}
int* pa = a, *pb = b;
for(int i = 0; i < m; i++) {
//pb肯定要后移,如果此时恰好pa指向了相等元素,pa也要后移
if(*pa == *pb) {
pa++;
//pa如果已经移到了a序列末尾,就说明a序列是b序列的子序列
if(pa - a == n) {
printf("Yes\n");
return 0;
}
}
pb++;
}
printf("No\n");
//malloc和free要相互对应,跟C++中new/delete规范一样
free(a);
free(b);
return 0;
}