[Leetcode解題] 392. Is Subsequence
24 April 2026
easy
string
two-pointers
題目
給定兩個字串 s 和 t,如果 s 是 t 的子序列,則回傳 true,否則回傳 false。
字串的子序列是透過刪除原字串中的某些字元(也可以不刪除)後,不改變剩餘字元相對位置所形成的新字串。(例如,"ace" 是 "abcde" 的子序列,而 "aec" 則不是)。
解題思路
這是一道典型的雙指標(Two Pointers)問題。我們需要檢查字串 s 的所有字元是否按順序出現在字串 t 中。
我們可以使用兩個指標來實作:
- 定義指標
p1指向字串s的開頭,指標p2指向字串t的開頭。 - 當
p1與p2皆未走訪完所屬的字串時,進行迴圈處理:- 比較
s[p1]和t[p2]:如果兩字元相同,代表我們在t中找到了s目前的字元,此時將p1和p2同時向右移動。 - 如果兩字元不同,代表
t目前的字元無法配對,我們只需將p2向右移動,繼續在t中尋找下一個配對的字元。
- 比較
- 迴圈結束後,檢查
p1是否走訪完了字串s。如果p1等於s的長度,代表s的所有字元都已經在t中依序找到,回傳true;否則回傳false。
特別留意字串長度的邊界條件,例如當 s 為空字串時,空字串永遠是任何字串的子序列,此寫法也能正確處理到。
Python 實作
class Solution:
def isSubsequence(self, s: str, t: str) -> bool:
p1, p2 = 0, 0
while p1 < len(s) and p2 < len(t):
if s[p1] == t[p2]:
p1 += 1
p2 += 1
return p1 == len(s)
C++ 實作
class Solution {
public:
bool isSubsequence(string s, string t) {
int p1 = 0, p2 = 0;
while (p1 < s.length() && p2 < t.length()) {
if (s[p1] == t[p2]) {
p1++;
}
p2++;
}
return p1 == s.length();
}
};
時間複雜度
兩個指標 p1 與 p2 走訪字串時,最多只會將字串 s 和字串 t 走訪一次。
因此總體時間複雜度為 $O(|s| + |t|)$,其中 $|s|$ 與 $|t|$ 分別為字串 s 與 t 的長度。
空間複雜度部分,由於只使用了常數個變數進行狀態維護,故空間複雜度為 $O(1)$。