• 392. 判断子序列


    题目

    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数组的生成方法!

  • 相关阅读:
    鼠标点击表格行背景变色
    2006年星座运势全解巨蟹
    去除衣物污渍大本营
    海量数据库的查询优化及分页算法方案[转帖]
    奇怪的Access错误
    深圳易高科技有限公司面试题目
    各大IT公司的起名缘由
    微星横向菜单
    【转】函数参数入栈问题
    堆和栈的区别 (转贴)
  • 原文地址:https://www.cnblogs.com/BoysCryToo/p/13392255.html
Copyright © 2020-2023  润新知