2019-03-22

难度

具体代码

我的代码的优点, 分情况考虑问题, 代码清晰.

注意事项

就是如果在某一点dp[i-1][j] == False 那么 dp[i][j]就要受到影响, 应该也是False

class Solution(object):
    def isInterleave(self, s1, s2, s3):
        """
        :type s1: str
        :type s2: str
        :type s3: str
        :rtype: bool
        """
        l1 = len(s1)
        l2 = len(s2)
        l3 = len(s3)
        
        # fast return
        if (l1+l2) != l3:
          return False
        
        # dp[i][j] 表示bool 矩阵
        # 表示是否可以使用s1的前i个字符串,包括s1[i-1]和s2的j个字符串,包括s2[j-1], 可否构成构成s3
        dp = [[0]*(l2+1) for _ in range (l1+1)]
        
        dp[0][0] = True
        
        for i in range(1,l1+1):
          # 注意状态迁移是有依赖上一个的状态的. 这个和`编辑距离`很像.
          dp[i][0] = dp[i-1][0] and s1[i-1] == s3[i-1]
          
        for j in range(1,l2+1):
          dp[0][j] = dp[0][j-1] and s2[j-1] == s3[j-1]
        
        for i in range(1,l1+1):
          for j in range(1,l2+1):
            # 使用 s1[i-1]之前要检查一下之前使用s1[i-2]是否可以构成s3
            use_s1 = dp[i-1][j] and ( s3[i+j-1] == s1[i-1] )
            use_s2 = dp[i][j-1] and ( s3[i+j-1] == s2[j-1] )
            dp[i][j] = use_s2 or use_s1
            
        return dp[-1][-1]
    原文作者:cptn3m0
    原文地址: https://www.jianshu.com/p/6e3a9fed7933
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞