📜  门|门 CS 1996 |第 40 题(1)

📅  最后修改于: 2023-12-03 15:12:45.785000             🧑  作者: Mango

门 | 门 CS 1996 | 第 40 题

本题为门 | 门 CS 1996 的第 40 题,考察了程序员在处理字符串时的能力。

题目描述

给定两个字符串 $a$ 和 $b$,请你判断 $a$ 是否可以通过在 $b$ 中添加某些字符形成。

输入格式

输入共两行,分别为字符串 $a$ 和 $b$。字符串长度 $1\leqslant |a|, |b| \leqslant 10^5$。

输出格式

若 $a$ 可以通过在 $b$ 中添加某些字符形成,则输出 "YES",否则输出 "NO"。

样例输入
ABC
ADOBECODEBANC
样例输出
YES
解题思路

此题可以通过双指针的方法进行解决。我们分别用两个指针 $i$ 和 $j$ 从左往右遍历字符串 $a$ 和 $b$,若 $a_i=b_j$,则 $i$ 和 $j$ 同时向右移动一位,否则只移动 $j$。当 $i$ 遍历完 $a$ 时,若 $i$ 和 $j$ 同时到达末尾,则说明 $a$ 可以通过在 $b$ 中添加某些字符形成;否则说明不行。

代码示例

Python 代码示例:

def is_subsequence(a: str, b: str) -> str:
    i = j = 0
    while i < len(a) and j < len(b):
        if a[i] == b[j]:
            i += 1
        j += 1
    return "YES" if i == len(a) else "NO"

C++ 代码示例:

#include <iostream>
using namespace std;

bool is_subsequence(string a, string b) {
    int i = 0, j = 0;
    while (i < a.size() && j < b.size()) {
        if (a[i] == b[j])
            i++;
        j++;
    }
    return i == a.size();
}

int main() {
    string a, b;
    cin >> a >> b;
    cout << (is_subsequence(a, b) ? "YES" : "NO") << endl;
    return 0;
}