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; } }