// C# Program to check if a
// given string is a scrambled
// form of another string
using System;
class GfG {
static bool scrambleRecur(int i1, int i2, int length,
string s1, string s2, int[,,] dp) {
// For single character, compare
// the two characters.
if (length == 1) {
return s1[i1] == s2[i2];
}
// If value is computed, return it.
if (dp[i1, i2, length] != -1)
return dp[i1, i2, length] == 1;
bool ans = false;
for (int len = 1; len < length; len++) {
// Check if s2[i2, i2+len-1] is scrambled version
// of s1[i1, i1+len-1] and s2[i2+len, i2+length-1]
// is scrambled version of s1[i1+len, i1+length-1].
bool val1 = scrambleRecur(i1, i2, len, s1, s2, dp) &&
scrambleRecur(i1 + len, i2 + len, length - len, s1, s2, dp);
// Check if s2[i2+length-len+1, i2+length] is scrambled
// version of s1[i1, i1+len-1] and s2[i2, i2+length-len]
// is scrambled version of s1[i1+len, i1+length-1].
bool val2 = scrambleRecur(i1, i2 + length - len, len, s1, s2, dp) &&
scrambleRecur(i1 + len, i2, length - len, s1, s2, dp);
// If any version is scrambled.
if (val1 || val2) {ans = true; break; }
}
// Memoize the value and return it.
dp[i1, i2, length] = ans ? 1 : 0;
return ans;
}
static bool isScramble(string s1, string s2) {
int n = s1.Length;
// Create a 3d array.
int[,,] dp = new int[n, n, n + 1];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
for (int k = 0; k <= n; k++)
dp[i, j, k] = -1;
return scrambleRecur(0, 0, n, s1, s2, dp);
}
static void Main() {
string s1 = "coder";
string s2 = "ocred";
if (isScramble(s1, s2)) {
Console.WriteLine("Yes");
} else {
Console.WriteLine("No");
}
}
}