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 =
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
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
Similarly, if we continue to swap the children of nodes
"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
Given two strings s1 and s2 of the same length, determine if s2 is a scrambled string of s1.
Analysis:"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.
The problem nicely defined the scramble string as a node-swapped binary tree. Thus, we want to check any two siblings that if they are swapped.
Consider base cases:
For any string pairs, if they are of different size or consisted of different sets of letters, they are not scramble string. Further:
- If two string are the same, they are scramble string
Consider the recursion. Suppose we have the following two trees:
node1 / \ left1 right1
node2 / \ left2 right2we will need to check isScramble(left1, left2) && isScramble(right1, right2), or isScramble(left1, right2) && isScramble(right1, left2), make sure the two strings passed in are the same length, as different-length strings are guaranteed to be non-Scramble.
The time complexity of this recursive algorithm is pretty high though in exponential. It gets pass the OJ because the conditions that I check before going to recursions.
In the worst situation, for any recursion f(n), we will check all the combinations twice, i.e., f(n) = 2[f(1) + f(n-1)] +2[f(2) + f(n-2)] … + 2[f(n/2) + f(n/2+1)], thus, f(n+1)=3*f(n), we have f(n)=3^n.
Code:
class Solution { public: bool isScramble(string s1, string s2) { int len=s1.size(); if (s1==s2) return true; if (s1.size()!=s2.size()) return false; int val1=0, val2=0; for (int i=0; i<len; i++) { val1+=s1[i]-'a'; val2+=s2[i]-'a'; } if (val1!=val2) return false; for (int i=1; i<len; i++) { string a1=s1.substr(0,i); string b1=s1.substr(i); string a2=s2.substr(0,i); string b2=s2.substr(i); if (isScramble(a1,a2)&&isScramble(b1,b2)) return true; string a3=s2.substr(len-i); string b3=s2.substr(0,len-i); if (isScramble(a1,a3)&&isScramble(b1,b3)) return true; } return false; } };
No comments:
Post a Comment