87. Scramble String
Description
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"
:

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"
.

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"
.

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.
Constraints
Approach
Links
Examples
Input: s1 = "great", s2 = "rgeat"
Output: true
Solutions
/**
* Time complexity :
* Space complexity :
*/
class Solution {
public boolean isScramble(String s1, String s2) {
if(s1.length() != s2.length()) return false;
if(s1.isEmpty() || s2.equals(s1)) return true;
int len = s1.length();
int[] countChars = new int[26];
for(int i = 0; i < len; i++) {
countChars[s1.charAt(i)-'a']++;
countChars[s2.charAt(i)-'a']--;
}
for(int i = 0; i < 26; i++) {
if(countChars[i] != 0) return false;
}
for(int i = 1; i < len; i++) {
if(isScramble(s1.substring(0, i), s2.substring(0, i)) &&
isScramble(s1.substring(i), s2.substring(i))) {
return true;
}
if(isScramble(s1.substring(0, i), s2.substring(len-i)) &&
isScramble(s1.substring(i), s2.substring(0, len-i))) {
return true;
}
}
return false;
}
}
Follow up
Last updated
Was this helpful?