35 判斷子串行(簡單)

2021-10-25 03:14:35 字數 3039 閱讀 7860

給定字串 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 ...