392. 判斷子序列 - 7月27日
阿新 • • 發佈:2020-07-28
題目
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())returntrue; 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 (intj = 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陣列的生成方法!