AcWing 2816. 判断子序列
AkariAcWing 2816. 判断子序列 [简单]
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。
数据范围
1 ≤ n ≤ m ≤ 10^5^,
−10^9^ ≤ ai, bi ≤ 10^9^
输入样例:
3 5
1 3 5
1 2 3 4 5
输出样例:
Yes
2 WA代码
emmm, 暴力? 但这也不对啊. 想不出来…
通过了
7/17
个数据.
|
3 解题思路
程序框架:
|
3.1 双指针遍历 + 外层循环判断
int i = 0, j = 0; |
其中内层循环判断可以优化, 在外层循环中增加了一个判断条件来提前退出循环,以减少不必要的比较操作。
// 如果 b 序列剩余的元素数量 < a 序列剩余的元素数量, 那么肯定不满足子序列的要求 |
3.2 双指针 + 内层循环过滤 (模板) * 2
1. 在序列
b
中查找与a[i]
相等的元素。在这种方法中,
i
主要用于遍历序列a
,而j
则用于在序列b
中查找与a[i]
相等的元素。- 每当遍历到
a
中的一个元素a[i]
时,就在序列b
中从当前位置j
开始向后查找是否有与a[i]
相等的元素。 - 如果找到了,则
j
移动到该元素的位置,然后i
和j
同时向后移动一位。 - 如果没有找到与
a[i]
相等的元素,那么a
序列就不是b
序列的子序列,直接输出"No"
并结束程序。
- 每当遍历到
for (int i = 0, j = 0; i < n; i ++ ) { |
2. 引入额外变量 t,表示序列 a 中还没有被匹配的元素数量。
在循环中,每当找到与
a[i]
相等的元素时,就将t--
,表示找到了一个匹配的元素。循环结束后,如果t
大于0
,那么说明序列a
中还有元素没有被匹配到,此时输出"No"
;否则输出"Yes"
。这种方法思路清晰简洁,通过
t
来记录未匹配的元素数量,不需要额外的条件判断,直接通过t
的值来判断是否为子序列。
int t = n; // t 是 a 数组还没有被匹配的数量 |
3.3 双指针 + 单层循环
循环中 j
作为快指针,遍历序列 b
,而 i
作为慢指针,用来遍历序列 a
。
j
指针用来扫描整个b
数组,i
指针用来扫描a
数组。若发现a[i] == b[j]
,则让i
指针后移一位- 整个过程中,
j
指针不断后移,而i
指针只有当匹配成功时才后移一位,若最后i == n
, 则说明匹配成功
int i = 0; // i 放外面, 之后会用到它判断是否走到了最后 |
评论
匿名评论隐私政策
TwikooWaline
✅ 你无需删除空行,直接评论以获取最佳展示效果