Skip to content

Latest commit

 

History

History
85 lines (71 loc) · 1.83 KB

87.md

File metadata and controls

85 lines (71 loc) · 1.83 KB
  1. Scamble String
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.

Below is one possible representation of s1 = "great":

    great
   /    \
  gr    eat
 / \    /  \
g   r  e   at
           / \
          a   t
To scramble the string, we may choose any non-leaf node and swap its two children.

For example, if we choose the node "gr" and swap its two children, it produces a scrambled string "rgeat".

    rgeat
   /    \
  rg    eat
 / \    /  \
r   g  e   at
           / \
          a   t
We say that "rgeat" is a scrambled string of "great".

Similarly, if we continue to swap the children of nodes "eat" and "at", it produces a scrambled string "rgtae".

    rgtae
   /    \
  rg    tae
 / \    /  \
r   g  ta  e
       / \
      t   a
We say that "rgtae" is a scrambled string of "great".

Given two strings s1 and s2 of the same length, determine if s2 is a scrambled string of s1.

my thoughts:

1. recursion

my solution:

**********100ms
class Solution:
    def isScramble(self, s1, s2):
        """
        :type s1: str
        :type s2: str
        :rtype: bool
        """
        if not s1 or not s2:
            return False
        if s1 == s2:
            return True
        chars = [0]*26
        for c in s1:
            chars[ ord(c) - 97 ] += 1
        for c in s2:
            chars[ ord(c) - 97 ] -= 1
        for n in chars:
            if n != 0:
                return False
        l = len(s1)
        for i in range(1, l):
            if self.isScramble(s1[:i], s2[:i]) and self.isScramble(s1[i:], s2[i:]):
                return True
            if self.isScramble(s1[:i], s2[-i:]) and self.isScramble(s1[i:], s2[:-i]):
                return True
        return False
            
        

my comments:


from other ppl's solution:

1. N/A