1. 程式人生 > 實用技巧 >LeetCode 392. 判斷子序列 雙指標

LeetCode 392. 判斷子序列 雙指標

地址https://leetcode-cn.com/problems/is-subsequence/

給定字串 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 的子序列。在這種情況下,你會怎樣改變程式碼?

解答

匹配的思路是從兩邊畢竟, 將問題華為字串的比較

isSubsequence(s[1~n] ,t[1~m])
如果在t中找到了首個匹配s[1]的位置 並且找到了最後一個匹配s[n]的位置
那麼問題就轉化為 isSubsequence(s[2~n-1] ,t[x~y])
直到沒找到匹配的位置 返回false 或者s最後為空也就是全部匹配 返回true

class Solution {
public:
      
bool isSubsequence(string s, string t) { if (s.empty()) return true; char head = s[0]; char tail = s.back(); int l =-1;int r = -1; for(int i =0;i < t.size();i++){ if(t[i] == head) { l =i;break; } } for(int i = t.size()-1
;i >=0;i--){ if(t[i] == tail){ r = i; break; } } if(l ==-1 || r==-1 || l >r ) return false; else if(l == r && s.size()!=1) return false; return isSubsequence(s.substr(1,s.size()-2) , t.substr(l+1,r-l-1) ); } };