leetcode:392. 判断子序列

题目

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

进阶

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

示例:

  1. 输入:s = "abc", t = "ahbgdc"
  2. 输出:true
输入:s = "axc", t = "ahbgdc"
输出:false

解答 & 代码

解法一:双指针

class Solution {
public:
    bool isSubsequence(string s, string t) {
        int sIdx = 0;
        int tIdx = 0;
        while(sIdx < s.size() && tIdx < t.size())
        {
            // 如果两个字符相等,则两个指针都右移
            if(s[sIdx] == t[tIdx])
            {
                ++sIdx;
                ++tIdx;
            }
            // 否则,字符串 t 的指针右移
            else
                ++tIdx;
        }
        // 如果 s 序列遍历完,说明 s 是 t 的子序列;否则不是
        return sIdx == s.size();
    }
};

复杂度分析:设字符串 s 长为 m,字符串t 长为 n

  • 时间复杂度 O(m + n):
  • 空间复杂度 O(1):

执行结果:

执行结果:通过

执行用时:0 ms, 在所有 C++ 提交中击败了 100.00% 的用户
内存消耗:6.1 MB, 在所有 C++ 提交中击败了 90.10% 的用户