链接:https://www.nowcoder.com/questionTerminal/5382ff24fbf34a858b15f93e2bd85307 来源:牛客网 给定两个字符串 s和 t ,判断 s是否为 t 的子序列。 你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度n ~= 500,000),而 s 是个短字符串(长度 <=100)。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
时间: 2025-06-26 09:25:10 浏览: 7
### 高效检查短字符串 `s` 是否为长字符串 `t` 的子序列
为了高效判断短字符串 `s` 是否为长字符串 `t` 的子序列,可以采用双指针方法。这种方法的时间复杂度为 O(n),其中 n 是较长字符串 `t` 的长度。
以下是具体实现:
#### 双指针算法描述
通过维护两个指针分别指向字符串 `s` 和 `t` 的起始位置,逐步遍历字符串 `t` 并尝试匹配字符串 `s` 中的字符。当成功匹配到字符串 `s` 的所有字符时,则说明 `s` 是 `t` 的子序列[^2]。
#### Python 实现代码
```python
def is_subsequence(s: str, t: str) -> bool:
i, j = 0, 0 # 初始化指针i用于遍历s,j用于遍历t
while i < len(s) and j < len(t): # 当两指针均未越界时继续循环
if s[i] == t[j]: # 如果当前字符相等
i += 1 # 移动s的指针
j += 1 # 不论是否匹配,都移动t的指针
return i == len(s) # 若s的所有字符都被匹配则返回True
```
此代码逻辑清晰且效率高,在最坏情况下只需一次线性扫描即可完成操作[^4]。
#### 复杂度分析
- **时间复杂度**: O(m + n),其中 m 和 n 分别表示字符串 `s` 和 `t` 的长度。这是因为我们最多会遍历整个字符串 `t` 以及部分或全部字符串 `s`。
- **空间复杂度**: O(1),仅需常数级别的额外存储空间来保存变量 `i`, `j`.
#### 测试案例
以下是一些测试用例及其预期结果:
```python
print(is_subsequence("abc", "ahbgdc")) # True
print(is_subsequence("axc", "ahbgdc")) # False
print(is_subsequence("", "ahbgdc")) # True (空字符串是任何字符串的子序列)
print(is_subsequence("abc", "")) # False (除非s为空,否则不可能成为空字符串的子序列)[^1]
```
阅读全文