給定字串 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 的子串行。在這種情況下,你會怎樣改變**?
雙指標法:
class
solution
: def issubsequence
(self, s: str, t: str)
-> bool:
'''雙指標法'
'' i =
0 j =
0while i <
len(s) and j <
len(t)
:if s[i]
== t[j]
: i +=
1 j +=
1else
: j +=
1if i ==
len(s)
:return true
else
:return false
生成器迭代器法:
生成器迭代器方法的思路:
t = iter(t) , 把列表 t 轉化成了乙個迭代器
(i for i in s) 產生乙個生成器, 這個生成器可以遍歷物件 s。
(i in t)可以聯想到 for in 語句。
(i in t) , 大致等價於
while true:
val = next(t)
if val == i:
yield true
巧妙地利用了成器的特性, next() 函式執行的時候, 儲存了當前的指標。
那麼((i in t) for i in s)可以理解為:遍歷s中元素 i,並在t中查詢元素 i 是否存在。
由於next() 函式和yield 生成器的特性,如果 t 存在 i 返回true並儲存當前指標不存在返回false
(下一次查詢從儲存的指標開始繼續查詢,直到s 或者 t 遍歷結束),這些true或false產生乙個迭代器。
最後的 all() 函式,判斷乙個迭代器的元素是否全部為 true, 如果是則返回 true, 否則就返回 false。
class
solution
: def issubsequence
(self, s: str, t: str)
-> bool:
'''生成器迭代器法'
'' t =
iter
(t)return
all(
((i in t)
for i in s)
)
後續挑戰:
後續挑戰的思路:
用雜湊集合hase_set記錄下t中每個字元出現過的位置,即最多有26個key
對s中每個字母進行匹配,s[i]一定出現在s[i-1]之後,所以匹配s[i]的時候,應該找hash_set[s[i]]中大於s[i-1]的索引的索引值
我們用匹配左邊界的二分法(即匹配第乙個大於等於目標值的數),找當前字母索引列表中第乙個大於上乙個字母索引的值
如果某個匹配到的邊界值等於當前字幕索引列表的長度,則表明無法匹配當前字母,返回false
全部成功匹配返回true
class
solution
: def issubsequence
(self, s: str, t: str)
-> bool:
'''後續挑戰'
'' hash_set =
for i, word in
enumerate
(t):
if word not in hash_set:
hash_set[word]
=[i]
else
: hash_set[word]
.(i)
# 匹配
index =-1
for word in s:
if word not in hash_set:
return false
# 字母s出現的索引 用二分法找到其中大於index的第乙個
判斷子串行
給定字串 s 和 t 判斷 s 是否為 t 的子串行。你可以認為 s 和 t 中僅包含英文小寫字母。字串 t 可能會很長 長度 500,000 而 s 是個短字串 長度 100 字串的乙個子串行是原始字串刪除一些 也可以不刪除 字元而不改變剩餘字元相對位置形成的新字串。例如,ace 是 abcde ...
子串行判斷
如下 class solution return true 字母ab yz鍊錶 索引1,索引2,索引 索引索引 判斷子串行,高階 有k個子序列,判斷是否是t的子串行 public static boolean issubsequence string s,string t else int p 1 ...
判斷子串行
給定字串 s 和 t 判斷 s 是否為 t 的子串行。你可以認為 s 和 t 中僅包含英文小寫字母。字串 t 可能會很長 長度 500,000 而 s 是個短字串 長度 100 字串的乙個子串行是原始字串刪除一些 也可以不刪除 字元而不改變剩餘字元相對位置形成的新字串。例如,ace 是 abcde ...