1. 程式人生 > 實用技巧 >392. 判斷子序列 - 7月27日

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陣列的生成方法!