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")
  • 相关阅读:
    数学+高精度 ZOJ 2313 Chinese Girls' Amusement
    最短路(Bellman_Ford) POJ 1860 Currency Exchange
    贪心 Gym 100502E Opening Ceremony
    概率 Gym 100502D Dice Game
    判断 Gym 100502K Train Passengers
    BFS POJ 3278 Catch That Cow
    DFS POJ 2362 Square
    DFS ZOJ 1002/HDOJ 1045 Fire Net
    组合数学(全排列)+DFS CSU 1563 Lexicography
    stack UVA 442 Matrix Chain Multiplication
  • 原文地址:https://www.cnblogs.com/shyustc/p/4392549.html
Copyright © 2011-2022 走看看