public class Solution {
public boolean isScramble(String s1, String s2) {
// 讲解 http://blog.csdn.net/fightforyourdream/article/details/17707187
// 代码 http://www.blogjava.net/sandy/archive/2013/05/22/399605.html
if(s1==null||s2 ==null||s1.length()!=s2.length()) return false;
if(s1.length()==0) return true; //s1 = s2=""
int len = s1.length();
char[] c1 = s1.toCharArray();
char[] c2 = s2.toCharArray();
boolean[][][] res = new boolean[len][len][len];
for(int i=0; i<len; i++){
for(int j=0; j <len; j++){
res[0][i][j]= (c1[i]==c2[j]);
}
}
for(int k=2; k<= len; k++){
for(int i=len-k; i>=0; i--){ <strong>// the order is from the base, i.e. begin from the last position</strong>
for(int j=len-k; j>=0; j--){
boolean r = false; // test if cut anywhere within k length, the scramble exists
for(int cut = 1; !r&&cut<k; cut++ ){
<strong><span style="color:#ff0000;"> r = (res[cut-1][i][j] && res[k-cut-1][i+cut][j+cut]) // 前前 && 后后
|| (res[cut-1][i][j+k-cut] && res[k-cut-1][i+cut][j]); // 前后 && 后前</span></strong>
}
res[k-1][i][j] = r; <strong>// can r go through all cuts within k?</strong>
}
}
}
<strong> return res[len-1][0][0]; // 体会什么叫bottom up</strong>