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.
[Thoughts]: Top-Down, Build approach from subproblems to the final destination。 isScramble(s1, s2) = true,
那么一定有一个位置i, 把s1分成两段,p1 和 p2, 把s2分成两段, q1 和 q2
且要么isScramble(p1, q1) && isScramble(p2, q2)
要么isScramble(p1, q2) && isScramble(p2, q1) // 记得计算substring使p2.len = q1.len.
public class Solution {
public boolean isScramble(String s1, String s2) {
if(s1.length()!=s2.length()) return false;
s1.toLowerCase(); s2.toLowerCase();
int[] value = new int[26];
//check if s1 and s2 have same characters.
for(int i=0; i<s1.length(); i++){
value[s1.charAt(i)-'a']++;
value[s2.charAt(i)-'a']--;
}
for(int i=0; i<value.length; i++){
if(value[i]!=0)
return false;
}
//收敛条件,只有一个char且相等时,返回ture
if(s1.length()==1)
return true;
for(int i=0; i<s1.length(); 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(s2.length()-i)) && isScramble(s1.substring(i), s2.substring(0,s2.length()-i)))
return true;
}
return false;
}
}
No comments:
Post a Comment