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 m+n != len(s3):
return False
if n == 0:
return s3 == s2
if m== 0:
return s3 == s1
if n == 1:
for i in range(m+1):
if s3[i] == s1:
return s3[:i]+s3[i+1:] ==s2
if m == 1:
for i in range(n+1):
if s3[i] == s2:
return s3[:i] + s3[i+1:] == s1
lt = [[0 for i in range(n+1)] for j in range(m+1)] #m hang n lie
lt[0][0] =True
for i in range(1,m+1):
lt[i][0] = (lt[i-1][0] and s2[i-1] == s3[i-1])
for j in range(1,n+1):
lt[0][j] = (lt[0][j-1] and s1[j-1] == s3[j-1])
for i in range(1,m+1):
for j in range(1,n+1):
lt[i][j] = (lt[i-1][j] and s2[i-1] == s3[i+j-1]) or (lt[i][j-1] and s1[j-1] == s3[i+j-1])
return lt[m][n]
给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成。
样例
比如 s1 = "aabcc" s2 = "dbbca"
- 当 s3 = "aadbbcbcac",返回 true.
- 当 s3 = "aadbbbaccc", 返回 false.
挑战
要求时间复杂度为O(n^2)或者更好
采用动态规划的思想,参考的是邹博算法教材!(注意第一行和第一列的初始化)