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