Sunday, January 11, 2015

Scramble String (LeetCode String)

Question: 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.

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