392. 判断子序列 - 7月27日

题目

392. 判断子序列

我的思路

两个指针,遍历即可。

 

我的实现

class Solution {
public:
    bool isSubsequence(string s, string t) {
        int pos_s=0;
        int pos_t=0;
        for(;pos_s<s.size()&&pos_t<t.size();pos_t++){
            if(s[pos_s]==t[pos_t])pos_s++;
        }
        if(pos_s==s.size())return true;
        else return false;
    }
};
//一个简单的想法:s和t各设置一个指针,最初指向两个字符串的首字符,若匹配则同时滑动,若不匹配则滑动t的指针。直到再次匹配或者到指针末尾

时间复杂度:m+n

空间复杂度:1

拓展学习

后续挑战

如果出现待匹配串特别多,T特别长,多次用上面的方法会非常耗时(因为T太长了,遍历一次开销大)。

所以对T做预处理,建立一个26(字符种类数)*m的辅助数组,其中存储下一个对应字符在T中出现的位置。借助这个辅助数组匹配依次的开销就是待匹配串的长度,相对来说小很多。

class Solution {
public:
    bool isSubsequence(string s, string t) {
        int n = s.size(), m = t.size();

        vector<vector<int> > f(m + 1, vector<int>(26, 0));
        for (int i = 0; i < 26; i++) {
            f[m][i] = m;
        }

        for (int i = m - 1; i >= 0; i--) {
            for (int j = 0; j < 26; j++) {
                if (t[i] == j + 'a')
                    f[i][j] = i;
                else
                    f[i][j] = f[i + 1][j];
            }
        }
        int add = 0;
        for (int i = 0; i < n; i++) {
            if (f[add][s[i] - 'a'] == m) {
                return false;
            }
            add = f[add][s[i] - 'a'] + 1;
        }
        return true;
    }
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/is-subsequence/solution/pan-duan-zi-xu-lie-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

数据结构-串(模式匹配复习)

见drive上的笔记。KMP算法,next数组的生成方法!

 

posted on 2020-07-28 17:13  BoysCryToo  阅读(141)  评论(0编辑  收藏  举报

导航