边工作边刷题:70天一遍leetcode: day 18-1
Interleaving String
这题首先要问的是为什么需要dp呢?如果s1和s2中没有duplicate,那么每次的选择就是唯一的 。但是s1和s2要保持和s3中的order,如果有duplicate并任意选择匹配,另一个数组中可匹配的元素就会被重复元素block住。比如s1=“aa”,s2=“ab”,s3=“aaba"。
- 注意这类涉及长度的dp都要从0开始,这个方便初始化
- 这题可以把空间降为线性的,用rolling array的方法,因为从dependency graph来看,当前dp元素依赖于本层的前一个和上层的同一位置:本层的前一个已经计算好了,而上层的同一位置在当前元素后不再需要,可以被当前元素取代。很多2d dp都可以类似的方法减少空间。
错误点
- s1的index为i-1,s2的index为j-1,那么对应的s3中的index为i+j-1,而不是i+j-2
class Solution(object):
def isInterleave(self, s1, s2, s3):
"""
:type s1: str
:type s2: str
:type s3: str
:rtype: bool
"""
n1=len(s1)
n2=len(s2)
n3=len(s3)
if n1+n2!=n3: return False
dp = [[False for j in range(n2+1)] for i in range(n1+1)]
dp[0][0]=True
for i in range(1, n1+1):
dp[i][0]=(s1[i-1]==s3[i-1] and dp[i-1][0])
for j in range(1, n2+1):
dp[0][j]=(s2[j-1]==s3[j-1] and dp[0][j-1])
for i in range(1, n1+1):
for j in range(1, n2+1):
dp[i][j]=((dp[i-1][j] and s3[i+j-1]==s1[i-1]) or
dp[i][j-1] and s3[i+j-1]==s2[j-1])
return dp[n1][n2]