此题可以用动态规划来做。
public boolean isScramble(String s1, String s2) {
int n = s1.length();
boolean[][][] dp = new boolean[n][n][n+1]; //s1从i开始,s2从j开始,长度为k的子序列互为Scramble
for(int i = n-1; i >= 0; i--)
for(int j = n-1; j>=0; j--)
for(int k = 1; k <= n-Math.max(i,j);k++)
{
if(s1.substring(i,i+k).equals(s2.substring(j,j+k)))
dp[i][j][k] = true;
else
{
for(int l = 1; l < k; l++)
{
if(dp[i][j][l] && dp[i+l][j+l][k-l] || dp[i][j+k-l][l] && dp[i+l][j][k-l])
{
dp[i][j][k] = true;
break;
}
}
}
}
return dp[0][0][n];
}
也可以递归
public boolean isScramble(String s1, String s2) {
if(s1.equals(s2)) return true;
int n = s1.length();
int[] letter = new int[26]; //判断s1、s2的字符是否一样
for(int i = 0;i < n;i++){
letter[s1.charAt(i)-'a']++;
letter[s2.charAt(i)-'a']--;
}
for(int i = 0;i < 26;i++){
if(letter[i] != 0) return false;
}
for(int i = 1;i < n;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(n-i)) && isScramble(s1.substring(i), s2.substring(0,n-i))) return true;
}
return false;
}