日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 392. 判断子序列(双指针二分查找)

發布時間:2024/7/5 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 392. 判断子序列(双指针二分查找) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 題目

給定字符串 s 和 t ,判斷 s 是否為 t 的子序列。

你可以認為 s 和 t 中僅包含英文小寫字母。字符串 t 可能會很長(長度 ~= 500,000),而 s 是個短字符串(長度 <=100)。

字符串的一個子序列是原始字符串刪除一些(也可以不刪除)字符而不改變剩余字符相對位置形成的新字符串。(例如,"ace"是"abcde"的一個子序列,而"aec"不是)。

示例 1: s = "abc", t = "ahbgdc" 返回 true.示例 2: s = "axc", t = "ahbgdc" 返回 false.

后續挑戰 :
如果有大量輸入的 S,稱作S1, S2, … , Sk 其中 k >= 10億,你需要依次檢查它們是否為 T 的子序列。在這種情況下,你會怎樣改變代碼?

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/is-subsequence
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

2.1 雙指針

  • 雙指針分別 i, j 指向 s, t
  • s[i] == t[j] 時,才 i++
class Solution { public:bool isSubsequence(string s, string t) {if(s.size() > t.size())return false;int i = 0, j = 0;for( ; i < s.size() && j < t.size(); ++j){if(s[i] == t[j])i++;}return (i==s.size());} };

2. 二分查找

當有大量的字符串s時,應將所有字符的下標存進表里,進行二分查找,提高效率
二分查找參考

class Solution {int L, R, mid; public:bool isSubsequence(string s, string t) {if(s.size() > t.size())return false;vector<vector<int>> m(26);//存儲t中字符對應的位置int i, j = 0;for(i = 0; i < t.size(); ++i){m[t[i]-'a'].push_back(i);//將t對應字符的下標存進數組}for(i = 0; i < s.size() && j < t.size(); ++i){j = binarysearch(m[s[i]-'a'], j);//對s中的字符在對應的t的數組里,查找大于等于j的位置if(j == -1)//沒找到,返回錯誤return false;j++;//找到了,下次查找開始的位置+1}return (i==s.size());}int binarysearch(vector<int>& v, int &pos)//找值>=pos的第一個{L = 0, R = v.size()-1;while(L <= R){mid = L+((R-L)>>1);if(v[mid] >= pos){if(mid==0 || v[mid-1] < pos)return v[mid];elseR = mid-1;}else if(v[mid] < pos)L = mid+1;}return -1;} };

總結

以上是生活随笔為你收集整理的LeetCode 392. 判断子序列(双指针二分查找)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。