class Solution {
public:
bool isScramble(string s1, string s2) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int n = s1.size();
vector<vector<vector<bool> > > dp;
for (int i = 0; i < n; i++) {
vector<vector<bool> > matrix(n, vector<bool>(n + 1));
dp.push_back(matrix);
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (s1[i] == s2[j])
dp[i][j][1] = true;
for (int k = 2; k <= n; k++)
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
for (int p = 1; p < k; p++) {
int q = k - p;
if (i + p >= n || j + p >= n || i + q >= n || j + q >= n)
continue;
if (dp[i][j][p] && dp[i + p][j + p][q] || dp[i][j + q][p] && dp[i + p][j][q]) {
dp[i][j][k] = true;
break;
}
}
return dp[0][0][n];
}
};
Small Case: 8ms
Large Case: 800ms
Time: O(n^4)
Space: O(n^3)