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")

 

posted @ 2015-04-04 17:48  程序员阿力  阅读(272)  评论(0编辑  收藏  举报