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.
Example 1:
Input: s1 = "great", s2 = "rgeat" Output: true
Example 2:
Input: s1 = "abcde", s2 = "caebd" Output: false
ATTENTION:
when we recursively call the function itself.use self before it.
use range remember it has two parameters,begin&end
During solving this problem I face the error report cannot find the
function because I didn't add self before the function I recursive.On the other
hand when you face a function or variable error ,find all possible places.
Such as me,this time only find one,so don't discover problem immediately
class Solution(object): def isScramble(self, s1, s2): N = len(s1) if N == 0: return True if N == 1: return s1 == s2 if sorted(s1) != sorted(s2): return False for i in range(1,N): if self.isScramble(s1[:i], s2[:i]) and self.isScramble(s1[i:],s2[i:]): return True elif self.isScramble(s1[:i], s2[-i:]) and self.isScramble(s1[i:],s2[:-i]): return True return False solu = Solution() s1 = "great" s2 = "rgeat" print(solu.isScramble(s1,s2))
Detailed Comment:
详细注释版
class Solution(object): def isScramble(self, s1, s2): """ :type s1: str :type s2: str :rtype: bool """ # NULL n=len(s1) # easy forget Judge NULL if sorted(s1)!=sorted(s2): return False if n==0: return 1 if n==1: return s1==s2 # range from 1 easy miss s[:0]bring error # actual meaning i-->partition string.0 partition no meaning for i in range(1,n): # core-->length==i # structure directly return only run once.just judge finally return if self.isScramble(s1[:i],s2[:i]) and self.isScramble(s1[i:],s2[i:]): return True # i range need combine to full.array range length before&after and needn't equal,equal meaningless elif self.isScramble(s1[:i], s2[-i:]) and self.isScramble(s1[i:], s2[:-i]): return True return False