Skip to main content

392.判断子序列

标签: array, two-pointers, string

难度: Easy

通过率: 48.12%

原题链接: https://leetcode.com/problems/is-subsequence/description/

题目描述

给定两个字符串 sstt,当且仅当 sstt 的一个子序列时返回 true,否则返回 false。字符串的子序列是通过删除一些(可以是不删除)字符形成的新字符串,且剩余字符的顺序不变。

解题思路

为了判断字符串 ss 是否是字符串 tt 的子序列,我们可以使用双指针方法:一个指针 ii 用于遍历字符串 ss,另一个指针 jj 用于遍历字符串 tt\n1. 初始化指针 $i=0$ 和 $j=0$。\n2. 当 jj 小于 tt 的长度时,进行以下判断:\n - 如果 $s[i]$ 等于 $t[j]$,则 $i$ 和 $j$ 同时增加1,表示匹配字符后移到下一个字符。\n - 否则,仅增加 jj 的值,表示继续在 tt 中寻找当前 s[i]s[i]\n3. 如果 $i$ 和 $s$ 的长度相同,则说明 $s$ 中所有字符都匹配上了,因此返回 true。\n4. 如果遍历完 tt,而 ii 仍然没有达到 ss 的长度,说明 ss 的某些字符没有匹配上,返回 false。```\n

代码实现

def isSubsequence(s: str, t: str) -> bool:
# 初始化指针i和j
i, j = 0, 0
# 遍历t
while j < len(t):
# 当s[i]和t[j]匹配时,i后移
if i < len(s) and s[i] == t[j]:
i += 1
# j总是后移
j += 1
# 如果i到达s的末尾,说明全部字符都能匹配
return i == len(s)

复杂度分析

时间复杂度为 O(n)O(n),其中 nn 是字符串 tt 的长度。因为我们在最坏情况下需要遍历整个字符串 tt

空间复杂度为 O(1)O(1),因为我们只需要几个额外的变量来进行指针操作。