![]()
class Solution {
public boolean isScramble(String s1, String s2) {
int n = s1.length();
if(n == 0) return true;
if(s1.equals(s2)) return true;
int[] arr = new int[26];
char[] arr1 = s1.toCharArray();
char[] arr2 = s2.toCharArray();
for(int i = 0; i < n; i++) {
arr[arr1[i] - 'a']++;
arr[arr2[i] - 'a']--;
}
for(int i = 0; i < 26; i++) {
if(arr[i] != 0) return false; // 先判断是否同构
}
for(int i = 1; i < n; i++) { // 再选一个分割点,对字符串AB/CD进行两种情况匹配的回溯,AC/BD和AD/BC
if(isScramble(s1.substring(0,i), s2.substring(n - i, n)) && isScramble(s1.substring(i,n), s2.substring(0,n-i))
|| (isScramble(s1.substring(0,i),s2.substring(0,i)) && isScramble(s1.substring(i,n), s2.substring(i,n)))) {
return true;
}
}
return false;
}
}