LeetCode 392. Is Subsequence 详解

题目详情

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

你可以认为 st 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。

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

示例 1:
s = "abc", t = "ahbgdc"

返回 true.

示例 2:
s = "axc", t = "ahbgdc"

返回 false.

后续挑战 :

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

分析

1. 解法1

首先这个题可以很容易的想出一个解法, 遍历s 然后遍历t 对t的每一个元素, 看是否等于s的一个元素, 同时维护一个变量保存上一次t和s相等的位置, 作为下一次遍历t的起点, 这样当遍历完整个t 如果s的字符有一个还没匹配就是false, 如果成功匹配就 true

class Solution {
public:
    bool isSubsequence(string s, string t) {
        //first 表示最近匹配成功的t的位置的下一个位置
        //conformSize表示S已匹配的字符
        int first = 0, conformSize = 0;
        
        for(int i = 0; i < s.size(); i++) {
            for (int j = first; j < t.size(); j++) {
                if (s[i] == t[j]){
                    first = j + 1;
                    conformSize++;
                    break;
                }
            }
        }
        //判断s是否完全匹配
       if (conformSize == s.size()) {
           return true;
        } else {
           return false;
        }
        
    }
};

这个解法速度很慢。

当然代码可以简化, 用一个变量维护当前匹配到s的位置就不用循环s了

bool isSubsequence(string s, string t) {
    int sLen = s.length(), sIdx = 0, tLen = t.length();
    for (int i=0; i<tLen && sIdx<sLen; i++) 
        if (t[i]==s[sIdx]) sIdx++;
    return sIdx==sLen;
}

速度变快了很多。

posted @ 2018-11-17 23:19  qq874455953  阅读(208)  评论(0编辑  收藏  举报