【leetcode】97.Interleaving String 解题报告

版权声明:本文为博主原创文章,未经博主允许不得转载。 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)]

猜你喜欢

转载自blog.csdn.net/dpengwang/article/details/82874939