Leetcode做题日记:97. 交错字符串(PYTHON)

给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。

示例 1:

输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”
输出: true

示例 2:

输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”
输出: false

第一次的代码:
递归判断

	def jc(s1,s2,s3):
            if len(s3)!=len(s1)+len(s2):
                return False
            if s3=='':
                return True
            else:
                a=s3[0]
                if s1 and a == s1[0] and jc(s1[1:],s2,s3[1:]):#若s3[0]是s1[0]
                    return True
                if s2 and a == s2[0] and jc(s1,s2[1:],s3[1:]):#若s3[0]是s2[0]
                    return True
                return False#若以上两种情况都不成立,返回False
        return jc(s1,s2,s3)

在倒数第二个例子超时了。

第二次代码:
采用动态规划,做完这题还是有一些心得,即s1,s2每次只能拿出第一个字母来组成s3,首先写出dp表的第一行,第一列,dp[0][0]指的是s1,s2都为空的时候,这时候是True,对于第一排,dp[0][1]要为T,首先s1的第一个字母要和s3[0]相同才行,列也是一样的。两个for循环执行dp[i][j]的迭代。

	if len(s3)!= len(s1+s2):#若长度不符合
            return False
        dp=[[False for i in range(len(s1)+1)] for j in range(len(s2)+1)] 
        dp[0][0]=True
        for i in range(1,len(s2)+1):#注意for循环里面有一个+1
            dp[i][0]=dp[i-1][0] and (s2[i-1]==s3[i-1])
            
        for i in range(1,len(s1)+1):
            dp[0][i]=dp[0][i-1] and (s1[i-1]==s3[i-1])
        
        for i in range(1,len(s2)+1):
            for j in range(1,len(s1)+1):
                #当使用s2的字母,即在dp表往下走一格
                dp[i][j]=dp[i][j] or (dp[i-1][j] and (s2[i-1]==s3[i+j-1]))
                #当使用s1的字母,即在dp表往右走一格,即True的轨迹只能是下或者左
                dp[i][j]=dp[i][j] or (dp[i][j-1] and (s1[j-1]==s3[i+j-1]))
        print(dp)
        return dp[len(s2)][len(s1)]

60ms,排名23%

你可能感兴趣的:(leetcode)