【力扣】392.判断子序列|每日一题|刷题打卡

55 阅读1分钟

一、题目描述

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace""abcde"的一个子序列,而"aec"不是)。

进阶:

如果有大量输入的 S,称作 S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?

致谢:

特别感谢 ****@pbrother 添加此问题并且创建所有测试用例。

 

示例 1:

输入: s = "abc", t = "ahbgdc"
输出: true

示例 2:

输入: s = "axc", t = "ahbgdc"
输出: false

 

提示:

  • 0 <= s.length <= 100
  • 0 <= t.length <= 10^4
  • 两个字符串都只由小写字符组成。

二、思路分析

通过遍历字符串 t 的每个字符,并与字符串 s 的字符进行比较。

  • 如果当前字符相等,则将 i 的值增加 1,表示在字符串 t 中找到了 s 的一个字符
  • 当 i 的值等于 s 的长度时,意味着我们已经在字符串 t 中找到了 s 的所有字符,且字符的顺序与 s 中的顺序一致。因此,我们可以判断 s 是 t 的子序列,并返回 true
  • 如果循环结束后,仍然没有找到 s 的所有字符,或者 s 的长度大于 t 的长度,那么说明 s 不是 t 的子序列,我们返回 false

三、代码答案

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isSubsequence = function (s, t) {
  if (s.length === 0) return true
  if (s.length > t.length) return false
  let i = 0
  for (let j = 0; j < t.length; j++) { 
    if (s[i] === t[j]) i++
    if (i === s.length) return true
  }
  return false
};