题目:

  1. 给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 s2 交错组成的。
  2. 示例 1
  3. 输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
  4. 输出:true
  5. 示例 2
  6. 输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
  7. 输出:false
  8. 来源:力扣(LeetCode
  9. 链接:https://leetcode-cn.com/problems/interleaving-string
  10. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

答案:

时间:

30min ,dp边界整的够呛,不过还好做出来了。

  1. class Solution:
  2. def isInterleave(self, s1: str, s2: str, s3: str) -> bool:
  3. if len(s1)+len(s2)!=len(s3):return False
  4. if not s1:return s2==s3
  5. if not s2:return s1==s3
  6. if not s3:return True
  7. s1="@"+s1
  8. s3="@"+s3
  9. n1,n2,n3=len(s1),len(s2),len(s3)
  10. dp=[[False]*(n1) for _ in range(n3)]
  11. dp[0][0]=True
  12. for i in range(1,n3):
  13. for j in range(min(n1,i+1)):
  14. k= i-j-1
  15. if s3[i]==s1[j]:
  16. dp[i][j]=dp[i][j] or dp[i-1][j-1]
  17. if 0<=k<n2 and s3[i]==s2[k]:
  18. dp[i][j]=dp[i][j] or dp[i-1][j]
  19. return dp[-1][-1]

要点:

1. 边界条件 在1串和3串前面+个特殊符号就好处理多了

2. j和k的范围需要注意。

3. 更新的时候用or更新

不然一个好好的True 就变成了False了。

其他:

代码报错:无