1. 程式人生 > >Leetcode 392:判斷子序列(最詳細的解法!!!)

Leetcode 392:判斷子序列(最詳細的解法!!!)

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

你可以認為 st 中僅包含英文小寫字母。字串 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

如有問題,希望大家指出!!!