LintCode-交叉字符串-动态规划

描述

给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成。

样例

比如 s1 = "aabcc" s2 = "dbbca"

- 当 s3 = "aadbbcbcac",返回  true.

- 当 s3 = "aadbbbaccc", 返回 false.

挑战

要求时间复杂度为O(n^2)或者更好

思路

State:
dp[i][j] 表示 A的前i个字符 与 B的前i个字符 能否交替组成 C的前 i+j的字符

Function:
dp[i][j] =
dp[i - 1][j] && (A[i-1] == C[i+j-1]) ||
dp[i][j - 1] && (B[j-1] == C[i+j-1])

Initialization:
dp[0][0] = true;
dp[i][0] = (A[0, 1, ..., i-1] == C[0, 1, ..., i-1])
dp[0][j] = (B[0, 1, ..., i-1] == C[0, 1, ..., i-1])

Answer:
dp[n][m]

代码

class Solution:
    """
    @param s1: A string
    @param s2: A string
    @param s3: A string
    @return: Determine whether s3 is formed by interleaving of s1 and s2
    """
    def isInterleave(self, s1, s2, s3):
        # write your code here
        n = len(s1)
        m = len(s2)
        if n == 0 and m == 0 and len(s3) == 0:
            return True
        if n+m != len(s3):
            return False
        dp = [[False for j in range(m+1)] for i in range(n+1)]
        for i in range(1, n+1):
            if s1[i-1] == s3[i-1]:
                dp[i][0] = True 
        for j in range(1, m+1):
            if s2[j-1] == s3[j-1]:
                dp[0][j] = True
        for i in range(1, n+1):
            for j in range(1, m+1):
                dp[i][j] = (dp[i-1][j] & (s1[i-1] == s3[i+j-1])) | (dp[i][j-1] & (s2[j-1]== s3[i+j-1]))
        return dp[n][m]

题目来源

https://www.lintcode.com/problem/interleaving-string/description

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 3,336评论 0 18
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,408评论 0 2
  • __ __ |__| _____ __ __ ┌...
    wangchuang2017阅读 6,813评论 2 1
  • 分治方法 将问题划分成互不相交的子问题 递归地求解子问题 将子问题的解组合起来 动态规划(两个要素:最优子结构、子...
    superlj666阅读 518评论 0 0
  • 上午看到群里家人发来的图片,心里欣喜万分,你又争得一分,这都是你的努力得来的,中午你看到妈妈在值勤,你咧开了...
    孙岑瑶阅读 104评论 0 0