📜  门| GATE-CS-2006 |第 51 题(1)

📅  最后修改于: 2023-12-03 14:58:26.961000             🧑  作者: Mango

题目描述

给定两个字符串 $S_1$ 和 $S_2$,判断 $S_1$ 是否是 $S_2$ 的一个子序列。

一个字符串的子序列是指从原字符串中删去若干个字符(可以不删),剩余字符的相对位置不变得到的字符串。

例如,字符串 "ACE" 是字符串 "ABCDE" 的一个子序列,但是字符串 "AEC" 不是字符串 "ABCDE" 的一个子序列。

注意:字符串 $S_1$ 和 $S_2$ 均只包含大写字母和小写字母。

解题思路

这道题可以用双指针法进行解题。

定义两个指针 $i$ 和 $j$,分别指向 $S_1$ 和 $S_2$ 的第一个字符。

如果 $S_1$ 的第一个字符和 $S_2$ 的第一个字符相等,则 $i$ 和 $j$ 分别向后移动。

如果 $S_1$ 的第一个字符和 $S_2$ 的第一个字符不相等,则只能移动 $j$。

重复以上步骤,直到 $S_1$ 字符串被遍历完毕或 $S_2$ 字符串被遍历完毕。

如果 $S_1$ 被遍历完毕,说明 $S_1$ 是 $S_2$ 的子序列;如果 $S_2$ 被遍历完毕,说明 $S_1$ 不是 $S_2$ 的子序列。

代码实现

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        i, j = 0, 0
        while i < len(s) and j < len(t):
            if s[i] == t[j]:
                i += 1
            j += 1
        return i == len(s)

总结

本题是一道比较简单的双指针题目,需要认真读题解释,理解题意。本题的解法适用于字符串匹配问题,也是实际工程开发中常用的技巧之一。