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.
Idea: Brute force. Try all possible ways to split s1 and s2 each to two substrings, then recursively test whether any way of split is a scramble, then return true.
Time:
public class Solution {
public boolean isScramble(String s1, String s2) {
HashMap<Character,Integer> counter=new HashMap<Character,Integer>();
for(char c:s1.toCharArray())
{
if(counter.containsKey(c))
counter.put(c,counter.get(c)+1);
else
counter.put(c,1);
}
for(char c:s2.toCharArray())
{
if(counter.containsKey(c))
counter.put(c,counter.get(c)-1);
else
return false;
}
for(Character key:counter.keySet())
{
if(counter.get(key)!=0)
return false;
}
if(s1.length()==1)
return true;
for(int i=1;i<s1.length();i++)
{
String sub11=s1.substring(0,i);
String sub12=s1.substring(i);
String sub21=s2.substring(0,i);
String sub22=s2.substring(i);
String sub31=s2.substring(0,s2.length()-i);
String sub32=s2.substring(s2.length()-i);
if(isScramble(sub11,sub21)&&isScramble(sub12,sub22))
return true;
if(isScramble(sub11,sub32)&&isScramble(sub12,sub31))
return true;
}
return false;
}
}
No comments:
Post a Comment