日常——判断子序列

431 阅读1分钟

题目描述

给定一个长度为 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。

数据范围

1nm105,1≤n≤m≤10^5, 109ai,bi109−10^9≤ai,bi≤10^9

输入样例:

3 5 1 3 5 1 2 3 4 5

输出样例:

Yes

Solution


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 判断子序列
 * 给定一个长度为 n 的整数序列 a1,a2,…,an 以及一个长度为 m 的整数序列 b1,b2,…,bm
 * 请你判断 a 序列是否为 b 序列的子序列。
 * 子序列指序列的一部分项按原有次序排列而得的序列,例如序列 {a1,a3,a5}
 * 是序列 {a1,a2,a3,a4,a5} 的一个子序列。
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String s[] = in.readLine().split(" ");
        int n = Integer.parseInt(s[0]);
        int m = Integer.parseInt(s[1]);
        int a[] = new int[n + 10];
        int b[] = new int[m + 10];
        s = in.readLine().split(" ");
        for (int i=0 ; i<n; i++){
            a[i] = Integer.parseInt(s[i]);
        }
        s = in.readLine().split(" ");
        for (int i=0 ; i<m; i++){
            b[i] = Integer.parseInt(s[i]);
        }
        int i=0,j=0;
        while(i < n && j < m){
            // 找到了 i 往前走
            if(a[i] == b[j]) i++;
            j++;
        }
        if(i == n ) System.out.println("Yes");
        else System.out.println("No");

    }
}