$$\color{Red}{判断子序列【双指针】-三种语言代码}$$
这里附带打个广告——————我做的所有的题解
包括基础提高以及一些零散刷的各种各样的题
题目介绍
给定一个长度为 n 的整数序列 a1,a2,…,an 以及一个长度为 m 的整数序列 b1,b2,…,bm。
请你判断 a 序列是否为 b 序列的子序列。
子序列指序列的一部分项按原有次序排列而得的序列,例如序列 {a1,a3,a5} 是序列 {a1,a2,a3,a4,a5} 的一个子序列。
输入格式
第一行包含两个整数 n,m。
第二行包含 n 个整数,表示 a1,a2,…,an。
第三行包含 m 个整数,表示 b1,b2,…,bm。
输出格式
如果 a 序列是 b 序列的子序列,输出一行 Yes。
否则,输出 No。
数据范围
1 ≤ n ≤ m ≤ 10 ^ 5
−10 ^ 9 ≤ ai, bi ≤ 10 ^ 9
输入样例:
3 5
1 3 5
1 2 3 4 5
输出样例:
Yes
java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int n, m, N = 100010;
static int[] a = new int[N];
static int[] b = new int[N];
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
String[] s1 = br.readLine().split(" ");
n = Integer.parseInt(s1[0]);
m = Integer.parseInt(s1[1]);
String[] s2 = br.readLine().split(" ");
String[] s3 = br.readLine().split(" ");
for (int i = 0; i < n; i++) a[i] = Integer.parseInt(s2[i]);
for (int i = 0; i < m; i++) b[i] = Integer.parseInt(s3[i]);
for (int i = 0, j = 0; j < m; j++) {
if (a[i] == b[j]) i++;
if (i == n){
System.out.println("Yes");
return;
}
}
System.out.println("No");
}
}
python3
j, cnt = 0, 0
n, m = map(int, input().split())
arr1 = [int(x) for x in input().split()]
arr2 = [int(x) for x in input().split()]
for i in range(m):
if arr2[i] == arr1[j]:
cnt += 1
j += 1
if cnt == n:
print('Yes')
break
if cnt < n:
print('No')
C++
#include <iostream>
#define read(x) scanf("%d", &x)
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N];
int main()
{
int n, m;
read(n), read(m);
for(int i=0; i<n; i++) read(a[i]);
for(int i=0; i<m; i++) read(b[i]);
int i = 0;
for(int j=0; j<m; j++)
{
if(i < n && a[i] == b[j]) i++;
}
if(i == n) printf("Yes\n");
else printf("No\n");
return 0;
}