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")
  • 相关阅读:
    第一次用NUnitAsp
    IT能够解决所有的商业问题吗?
    在这种东西里面,你会自在吗?
    看了段.net show之后的感想
    获取当前数据库中所有表的记录数
    对瀑布模型各阶段的解释
    Linux内核中的slab/slob/slub 在搞晕前先记下来
    分布式事务AT、TCC、Saga、XA 模式分析对比
    读懂Windows的“虚拟内存”为你量身定制
    示范NTFS 卷上的硬链接
  • 原文地址:https://www.cnblogs.com/shyustc/p/4392549.html
Copyright © 2011-2022 走看看