版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dpengwang/article/details/82874939
给出三个字符串,问前两个字符串能否交叉得到第三个字符串(是一道面试常常考的题)
method1(wrong):
拿到题目第一个愚蠢的想法就是用双指针,用三个指针分别指向三个字符串,cur1、cur2、cur3分别指向s1、s2、s3,指针从s3上开始移动,每移到一个元素就去cur1、cur2上找有没有相等的元素,如果在s1或s2上找到找到的话就将对应的指针向前移动,如果cur3不能继续向前移动则失败,如果三个指针都移动到了字符串结尾,则匹配成功
问题:当cur3指向的元素和cur1、cur2指向的元素相同的时候,cur1和cur2指针到底该移动哪个呢,所以该方案不可行,受此方案启发想到第二种方法:递归法
method2(right but Time Limit Exceeded)
先上代码
class Solution:
def isInterleave(self, s1, s2, s3):
"""
:type s1: str
:type s2: str
:type s3: str
:rtype: bool
"""
if len(s1)+len(s2)!=len(s3):return False
if len(s1)==0 and len(s2)==0 and len(s3)==0:return True
else:
if len(s1)>0 and len(s2)>0:
if s1[0]==s3[0] and s2[0]==s3[0]:return self.isInterleave(s1[1:],s2[:],s3[1:]) or self.isInterleave(s1,s2[1:],s3[1:])
elif s1[0]==s3[0] and s2[0]!=s3[0]: return self.isInterleave(s1[1:],s2,s3[1:])
elif s1[0]!=s3[0] and s2[0]==s3[0]: return self.isInterleave(s1,s2[1:],s3[1:])
else: return False
elif len(s1)==0 and len(s2)>0 and s2[0]==s3[0]:return self.isInterleave(s1,s2[1:],s3[1:])
elif len(s1)>0 and len(s2)==0 and s1[0]==s3[0]:return self.isInterleave(s1[1:],s2,s3[1:])
else: return False
对于s3,指针每次向前移动一个单位,对于s1和s2,如果s3指针指向的当前元素能与s1或者s2中的首字母匹配的上,那么就将匹配后的子字符传递归的传入到函数中进行判断,但是该方法时间复杂度太高,在提交后显示超时
method3( right)
这是一道典型的二维动态规划题,递推公式如代码所示,如果s1的第i个位置和s2的第j个位置恰好交叉得到s3的前i+j 个元素,那么至少满足以下两个条件之一
- s1前i-1个元素和s2的前j个元素交叉构成s3的前i+j-1个元素
- s1前i个元素和s2的前j-1个元素交叉构成s3的前i+j-1个元素
代码如下
class Solution:
def isInterleave(self, s1, s2, s3):
"""
:type s1: str
:type s2: str
:type s3: str
:rtype: bool
"""
#s1 为横行 s2为竖列
if len(s1)+len(s2)!=len(s3):return False
dp =[[False for i in range(len(s1)+1)] for j in range(len(s2)+1)]
dp[0][0] =True
for i in range(1,len(s1)+1):
if(s1[i-1]==s3[i-1] and dp[0][i-1]):
dp[0][i]=True
for j in range(1,len(s2)+1):
if(s2[j-1]==s3[j-1] and dp[j-1][0]):
dp[j][0]=True
# print(dp)
for i in range(1,len(s2)+1):
for j in range(1,len(s1)+1):
if s1[j-1]==s3[i+j-1]:
dp[i][j] =dp[i][j] or dp[i][j-1]
if s2[i-1]==s3[i+j-1]:
dp[i][j] =dp[i][j] or dp[i-1][j]
return dp[len(s2)][len(s1)]