題目
給定字符串 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.
解法一(C# 雙指針法)
就是使用雙指針,一個指向子串,一個指向母串,如果相同子串指針向後移動,直到任一字符串遍歷結束。
- 字符相同時子串指針向後移動
- 每次檢查完母串指針向後移動
- 時間複雜度:O(n)
- 空間複雜度:O(1)
public class Solution {
public bool IsSubsequence(string s, string t) {
int idxS=0, idxT=0;
while(idxS < s.Length && idxT < t.Length)
{
if(s[idxS] == t[idxT])
{
idxS ++;
}
idxT ++;
}
return idxS == s.Length;
}
}
解法二(Python迭代器)
通過iter得到母串的迭代器,依次對子串進行檢查,可以看到就兩行代碼,代碼真是Pythonic
- 母串使用iter生成迭代器,用於從前向後按順序依次訪問
- 子串使用for in作爲生成器,方便每次使用next向後遍歷
- all用於判斷是否全爲True
class Solution:
def isSubsequence(self, s: str, t: str) -> bool:
t = iter(t)
return all(i in t for i in s)