兩種解法 - 判斷字符串的子串


題目

給定字符串 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# 雙指針法)

就是使用雙指針,一個指向子串,一個指向母串,如果相同子串指針向後移動,直到任一字符串遍歷結束。

  1. 字符相同時子串指針向後移動
  2. 每次檢查完母串指針向後移動
  • 時間複雜度: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

  1. 母串使用iter生成迭代器,用於從前向後按順序依次訪問
  2. 子串使用for in作爲生成器,方便每次使用next向後遍歷
  3. all用於判斷是否全爲True
class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        t = iter(t)
        return all(i in t for i in s)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章