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.
根据以上规则,找出是否两个字符串s1,s2能变换得到:
还是想到DFS
为了简单剪枝,进行了质数乘法的字符组合判断:
判断的时候对s1,s2拆分,若s1能变换成s2,则满足其中一个条件:
1)s1的前i位可以和s2的前i位变换,s1的后length-i位可以和s2的后length-i位变换;
2)s1的前i位可以和s2的后i位变换,s1的后length-i位可以和s2的前length-i位变换。
public class Solution {
private static final int[] albet={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101};
public boolean isScramble(String s1, String s2) {
if(s1.equals(s2))
return true;
for(int i=1;i<s1.length();i++){
boolean flag = false;
if(isEqual(s1.substring(0,i).toCharArray(),s2.substring(0,i).toCharArray())){
flag=isScramble(s1.substring(0,i), s2.substring(0,i))&&isScramble(s1.substring(i), s2.substring(i));
}
if(flag)
return true;
if(isEqual(s1.substring(0,i).toCharArray(),s2.substring(s2.length()-i).toCharArray())){
flag=isScramble(s1.substring(0,i), s2.substring(s2.length()-i))&&isScramble(s1.substring(i), s2.substring(0,s2.length()-i));
}
if(flag)
return true;
}
return false;
}
public boolean isEqual(char[] a, char[] b){
long sum_a=1L,sum_b=1L;
for(int i=0;i<a.length;i++){
sum_a*=albet[a[i]-'a'];
}
for(int i=0;i<b.length;i++){
sum_b*=albet[b[i]-'a'];
}
return sum_a==sum_b;
}
}