zoukankan      html  css  js  c++  java
  • leetcode Interleaving String python 解法

    Given s1s2s3, find whether s3 is formed by the interleaving of s1 and s2.

    For example,
    Given:
    s1 = "aabcc",
    s2 = "dbbca",

    When s3 = "aadbbcbcac", return true.
    When s3 = "aadbbbaccc", return false.

    方案1:DFS

    class Solution:
        # @return a boolean
        def isInterleave(self, s1, s2, s3):
            if len(s1)+len(s2) == len(s3):
                return self.DFS(s1,s2,s3)
            else:
                return False
                
        def DFS(self,s1,s2,s3):
            if not (s1 and s2) :
                if s3 == s1+s2:
                    return True
                else:
                    return False
                
            if s1[0] == s3[0] and self.DFS(s1[1:],s2,s3[1:]):
                return True
            elif s2[0] == s3[0] and self.DFS(s1,s2[1:],s3[1:]):
                return True
            else:
                return False
        

    很不幸的是,超时了

    方案2:BFS

    import Queue
    
    class Solution:
        # @return a boolean
        def isInterleave(self, s1, s2, s3):
            if len(s1)+len(s2) == len(s3):
                return self.BFS(s1,s2,s3)
            else:
                return False
                
        def BFS(self,s1,s2,s3):
            q = Queue.Queue(len(s3))
            q.put((0,0))
            while(not q.empty()):
                (x,y) = q.get()
                if x==len(s1) or y == len(s2):
                    if s3[x+y:] == s1[x:]+s2[y:]:
                        return True
                    else:
                        return False
                if s1[x] == s3[x+y]:
                    q.put((x+1,y))
                if s2[y] == s3[x+y]:
                    q.put((x,y+1))
            
            return False

    还是超时

    超时原因:没有对遍历的过程进行记录,导致运算量过大

    修改

    BFS

    import Queue
    
    class Solution:
        # @return a boolean
        def isInterleave(self, s1, s2, s3):
            if len(s1) == 0 or len(s2) == 0 or len(s3) == 0:
                if s1 +s2 == s3:
                    return True
                else:
                    return False
            if len(s1)+len(s2) == len(s3):
                return self.BFS(s1,s2,s3)
            else:
                return False
                
        def BFS(self,s1,s2,s3):
            compared = []
            q = Queue.Queue()
            q.put((0,0))
            compared.append((0,0))
            while(not q.empty()):
                (x,y) = q.get()
                #if x==len(s1) or y == len(s2):
                if s3[x+y:] == s1[x:]+s2[y:] or s3[x+y:] == s2[y:]+s1[x:]:
                    return True
                if s1[x] == s3[x+y]:
                    if (x+1,y) not in compared and x+1<len(s1):
                        compared.append((x+1,y))
                        q.put((x+1,y))
                if s2[y] == s3[x+y]:
                    if (x,y+1) not in compared and y+1<len(s2):
                        compared.append((x,y+1))
                        q.put((x,y+1))
            
            return False

    DFS记录过程非常困难,只好使用全局变量

    class Solution:
        compared = []
        # @return a boolean
        def isInterleave(self, s1, s2, s3):
            if len(s1)+len(s2) == len(s3):
                return self.DFS(s1,s2,s3)
            else:
                return False
                
        def DFS(self,s1,s2,s3):
            if (len(s1),len(s2)) in self.compared:
                return False
            else:
                self.compared.append((len(s1),len(s2)))
            
            print self.compared
    
            if s3 == s1+s2 or s3 == s2+s1:
                return True
            elif not (s1 and s2) :
                return False
                
            if s1[0] == s3[0] and self.DFS(s1[1:],s2,s3[1:]):
                return True
            elif s2[0] == s3[0] and self.DFS(s1,s2[1:],s3[1:]):
                return True
            else:
                return False
        
    func = Solution()
    print func.isInterleave("aa", "ab", "abaa")
  • 相关阅读:
    python疑难问题---5、二维列表初始化
    python疑难问题---4、python文件读写
    心得体悟帖---200701(你以为后面比当下好,其实还真的不一定)
    心得体悟帖---200701(《隐秘的角落》成熟的孩子小白)
    div垂直居中 css div盒子上下垂直居中
    iOS 7 新版微信 URL 不支持跳转 App Store 的解决方案
    HTML5 LocalStorage 本地存储
    WDCP是什么 关于WDCP的详细介绍
    前端框架用哪个好
    GWT 实现文件上传和下载
  • 原文地址:https://www.cnblogs.com/shyustc/p/4392549.html
Copyright © 2011-2022 走看看