LintCode 交叉字符串
来源:互联网 发布:网络货币有哪些 编辑:程序博客网 时间:2024/05/29 17:24
给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成。
样例
比如 s1 = “aabcc” s2 = “dbbca”
- 当 s3 = "aadbbcbcac",返回 true.- 当 s3 = "aadbbbaccc", 返回 false.
动态规划
dp[i,j]表示s1的前i个字符与s2的前j个字符能否交叉构成s3的前(i+j)个字符。
对于s3中的第i+j个字符,有以下几种可能:
- s3[i+j]==s1[i] and s3[i+j]==s2[j]
- s3[i+j]==s1[i] and s3[i+j]!=s2[j]
- s3[i+j]!=s1[i] and s3[i+j]==s2[j]
- s3[i+j]!=s1[i] and s3[i+j]!=s2[j]
第1种,若s1的前i-1个字符与s2的前j个字符能交叉构成s3的前i-1+j个字符,即dp[i-1,j]==True,那么dp[i,j]=True。或者,s2的前j-1个字符和s1的前i个字符能交叉构成s3的前i+j-1个字符,即dp[i,j-1]==True,那么dp[i,j]=True。综上,dp[i,j]=dp[i-1,j] or dp[i,j-1]。
第2种,若s1的前i-1个字符与s2的前j个字符能交叉构成s3的前i-1+j个字符,即dp[i-1,j]==True,那么dp[i,j]=True。 但是,由于s3[i+j]!=s2[j],所以无论s2的前j-1个字符和s1的前i个字符能否交叉构成s3的前i+j-1个字符,即无论dp[i,j-1]是否为True,dp[i,j]都是False。综上,dp[i,j]=dp[i-1,j]。
第3种与第2种类似。
第4种,dp[i,j]一定为False。
代码如下:
class Solution: """ @param: : A string @param: : A string @param: : A string @return: Determine whether s3 is formed by interleaving of s1 and s2 """ def isInterleave(self, s1, s2, s3): # write your code here、 m=len(s1) n=len(s2) z=len(s3) if m+n!=z: #当长度不匹配时,返回False return False dp=[[0 for x in range(n+1)] for y in range(m+1)] dp[0][0]=True #s1前0个与s2前0个能交叉构成s3前0个 for i in range(1,m+1): #s1前i个与s2前0个能否构成s3前i个 if s1[i-1]==s3[i-1]: dp[i][0]=dp[i-1][0] else: dp[i][0]=False for j in range(1,n+1): #s1前0个与s2前j个能否构成s3前j个 if s2[j-1]==s3[j-1]: dp[0][j]=dp[0][j-1] else: dp[0][j]=False for i in range(1,m+1): #s1前i个与s2前j个能否构成s3前i+j个(i>=1,j>=1) for j in range(1,n+1): if s1[i-1]==s3[i+j-1] and s2[j-1]==s3[i+j-1]: dp[i][j]=(dp[i-1][j] or dp[i][j-1]) elif s1[i-1]==s3[i+j-1]: dp[i][j]=dp[i-1][j] elif s2[j-1]==s3[i+j-1]: dp[i][j]=dp[i][j-1] else: dp[i][j]=False return dp[m][n]
阅读全文
0 0
- LintCode-交叉字符串
- LintCode(M)交叉字符串
- LintCode 29-交叉字符串
- LintCode 29 交叉字符串
- LintCode 交叉字符串
- lintcode -- 交叉字符串
- LintCode 交叉字符串
- lintcode 29. 交叉字符串
- lintcode interleaving-string 交叉字符串
- [Lintcode] Interleaving String 交叉字符串
- (lintcode)第29题交叉字符串
- lintcode 交叉链表
- 交叉字符串
- 交叉字符串
- 交叉字符串
- 交叉字符串
- 交叉字符串
- 交叉字符串
- YARN 架构
- Crawling World Wild Web at Scale
- python函数之join
- Python3 操作系统与路径 模块(os / os.path / pathlib)
- 集深V5报表迁移到计算报表V5,报表迁移成功后预览报错
- LintCode 交叉字符串
- 做市业务
- oracle用户被锁定的解决方法
- 函数重载
- <c:set />与<c:out />标签的用法
- 飞机上为何要禁止随身携带任何液态物品
- Android 水波涟漪图片特效 绝对震撼
- 自定义适配器getview方法
- WinServer misc