Leetcode 392:判斷子序列(最詳細的解法!!!)
阿新 • • 發佈:2018-12-13
給定字串 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 的子序列。在這種情況下,你會怎樣改變程式碼?
解題思路
這個問題同樣非常簡單,我們只需要建立兩個指標,一個指向s_p
,一個指向t_p
。
s: a b c
|
s_p
t: a h b g d c
|
t_p
然後我們不斷挪動t_p
,看t_p
指向的元素和s_p
指向的元素是否相等,如果不等的話繼續移動t_p
;否則,如果相等的話,我們挪動t_p
的同時也挪動s_p
,直到t_p
到了t
的邊界。在此期間,如果s_p
到了s
的邊界的話,我們直接返回True
了。如果整個迴圈結束,也就是t
遍歷完都沒有返回True
的話,說明不存在,我們返回False
就可以了。
class Solution:
def isSubsequence (self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
if s == None or t == None:
return False
len_s = len(s)
len_t = len(t)
if len_t < len_s:
return False
if len_s == 0:
return True
j = 0
for i in range(len_t):
if s[j] == t[i]:
j += 1
if j == len_s:
return True
return False
實際上,上述過程可以更加的簡潔。我們使用內建函式find
,就可以快速定位字元的位置。
class Solution:
def isSubsequence(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
for per_s in s:
s_index_t = t.find(per_s)
if s_index_t == -1:
return False
if s_index_t == len(t) - 1:
t = str()
else:
t = t[s_index_t+1:]
return True
如有問題,希望大家指出!!!