97. 交错字符串
递归,DP两种方法
https://leetcode-cn.com/problems/interleaving-string/
class Solution: def isInterleave(self, s1: str, s2: str, s3: str) -> bool: # if sorted(s1+s2)!=sorted(s3): # return False # l1,l2,l3 = len(s1),len(s2),len(s3) # # if l1==l2==l3==0:return True # dp = [[False]*(l2+1) for _ in range(l1+1)] # dp[0][0] = True # i=j=-1 # while i<l1-1: # i+=1 # if s1[i]==s3[i]:dp[i+1][0]=True # else: break # while j<l2-1: # j+=1 # if s2[j] == s3[j]:dp[0][j+1]=True # else:break # for i in range(1,l1+1): # for j in range(1,l2+1): # # 比如 s1第三个数 s2第二个数 i=3 j=2; s1[2] == s3[3+2-1] # dp[i][j] = (dp[i-1][j] and s1[i-1]==s3[i+j-1]) or (dp[i][j-1] and s2[j-1]==s3[i+j-1]) # for i in dp: # print(i) # return dp[-1][-1] l1,l2,l3 = len(s1),len(s2),len(s3) p1=p2=p3=0 while p1<l1 and p2<l2 and p3<l3: if s1[p1]==s2[p2]==s3[p3]: res1 = self.isInterleave(s1[p1+1:], s2[p2:], s3[p3+1:]) res2 = self.isInterleave(s1[p1:], s2[p2+1:], s3[p3+1:]) res = res1 or res2 return res elif s1[p1] == s3[p3]: p1+=1 p3+=1 elif s2[p2] == s3[p3]: p2+=1 p3+=1 else: return False if p1==l1: return s2[p2:] == s3[p3:] elif p2 == l2: return s1[p1:] == s3[p3:]