package com.interview.books.leetcodeoj; /** * Created_By: stefanie * Date: 14-12-23 * Time: 下午9:55 */ public class LOJ87_ScrambleString { //state: scramble[len][i][j], whether substring of length len start from i in s1 and j in s2 are scramble. //initialize: scramble[1][i][j] = true, if s1.charAt(i) == s2.charAt(j) //function: scramble[len][i][j] = true for any cutting point k from 1 to len - 1 meeting one of the following conditions: // 1) scramble[k][i][j] and scramble[len-k][i+k][j+k] // 2) scramble[k][i][j+len-k] and scramble[len-k][i+k][j] //result: scramble[n][0][0] public boolean isScramble(String s1, String s2) { if(s1.length() != s2.length()) return false; if(s1.length() == 0 || s1.equals(s2)) return true; int n = s1.length(); boolean[][][] scramble = new boolean[n + 1][n][n]; for(int i = 0; i < s1.length(); i++){ for(int j = 0; j < s2.length(); j++){ if(s1.charAt(i) == s2.charAt(j)) scramble[1][i][j] = true; } } for(int len = 2; len <= n; len++){ for(int i = 0; i <= n - len; i++){ for(int j = 0; j <= n - len; j++){ boolean found = false; for(int left = 1; left < len && !found; left++){ int right = len - left; found = (scramble[left][i][j] && scramble[right][i+left][j+left]) || (scramble[left][i][j+right] && scramble[right][i+left][j]); } scramble[len][i][j] = found; } } } return scramble[n][0][0]; } }