leetcode-392-判断子序列

题目描述:

 

 

 

 方法一:双指针 O(N+M) O(1)

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        if s == "" and t == "":
            return True
        if t == "":
            return False
        i, j = 0,0
        while i < len(s):
            if s[i] == t[j]:
                i += 1
            j += 1
            if j == len(t) and i < len(s):
                return False
        return True

优化:

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        n, m = len(s), len(t)
        i = j = 0
        while i < n and j < m:
            if s[i] == t[j]:
                i += 1
            j += 1
        return i == n

进阶问题解法:动态规划:O(26m+n) O(26m)

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        n, m = len(s), len(t)
        f = [[0] * 26 for _ in range(m)]
        f.append([m] * 26)

        for i in range(m - 1, -1, -1):
            for j in range(26):
                f[i][j] = i if ord(t[i]) == j + ord('a') else f[i + 1][j]
        
        add = 0
        for i in range(n):
            if f[add][ord(s[i]) - ord('a')] == m:
                return False
            add = f[add][ord(s[i]) - ord('a')] + 1
        
        return True

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/is-subsequence/solution/pan-duan-zi-xu-lie-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

posted @ 2020-07-28 21:41  oldby  阅读(161)  评论(0编辑  收藏  举报