Skip to content

Commit f148a12

Browse files
committed
feat: add solutions to lc problem: No.0087
No.0087.Scramble String
1 parent 0bb9cb4 commit f148a12

File tree

9 files changed

+803
-185
lines changed

9 files changed

+803
-185
lines changed

solution/0000-0099/0087.Scramble String/README.md

Lines changed: 334 additions & 57 deletions
Large diffs are not rendered by default.

solution/0000-0099/0087.Scramble String/README_EN.md

Lines changed: 337 additions & 40 deletions
Large diffs are not rendered by default.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class Solution {
2+
public:
3+
bool isScramble(string s1, string s2) {
4+
int n = s1.size();
5+
int f[n][n][n + 1];
6+
memset(f, -1, sizeof(f));
7+
function<bool(int, int, int)> dfs = [&](int i, int j, int k) -> int {
8+
if (f[i][j][k] != -1) {
9+
return f[i][j][k] == 1;
10+
}
11+
if (k == 1) {
12+
return s1[i] == s2[j];
13+
}
14+
for (int h = 1; h < k; ++h) {
15+
if (dfs(i, j, h) && dfs(i + h, j + h, k - h)) {
16+
return f[i][j][k] = true;
17+
}
18+
if (dfs(i + h, j, k - h) && dfs(i, j + k - h, h)) {
19+
return f[i][j][k] = true;
20+
}
21+
}
22+
return f[i][j][k] = false;
23+
};
24+
return dfs(0, 0, n);
25+
}
26+
};
Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,34 @@
11
public class Solution {
2+
private string s1;
3+
private string s2;
4+
private int[,,] f;
5+
26
public bool IsScramble(string s1, string s2) {
3-
if (s1.Length != s2.Length) return false;
4-
var length = s1.Length;
5-
if (length == 0) return true;
6-
var f = new bool[length + 1, length, length];
7-
for (var i = 0; i < length; ++i)
8-
{
9-
for (var j = 0; j < length; ++j)
10-
{
11-
f[1, i, j] = s1[i] == s2[j];
12-
}
7+
int n = s1.Length;
8+
this.s1 = s1;
9+
this.s2 = s2;
10+
f = new int[n, n, n + 1];
11+
return dfs(0, 0, n);
12+
}
13+
14+
private bool dfs(int i, int j, int k) {
15+
if (f[i, j, k] != 0) {
16+
return f[i, j, k] == 1;
1317
}
14-
for (var i = 2; i <= length; ++i)
15-
{
16-
for (var j = 0; j <= length - i; ++j)
17-
{
18-
for (var k = 0; k <= length - i; ++k)
19-
{
20-
for (var l = 1; l < i; ++l)
21-
{
22-
if (f[l, j, k] && f[i - l, j + l, k + l]
23-
|| f[l, j, k + i - l] && f[i - l, j + l, k])
24-
{
25-
f[i, j, k] = true;
26-
break;
27-
}
28-
}
29-
}
18+
if (k == 1) {
19+
return s1[i] == s2[j];
20+
}
21+
for (int h = 1; h < k; ++h) {
22+
if (dfs(i, j, h) && dfs(i + h, j + h, k - h)) {
23+
f[i, j, k] = 1;
24+
return true;
25+
}
26+
if (dfs(i, j + k - h, h) && dfs(i + h, j, k - h)) {
27+
f[i, j, k] = 1;
28+
return true;
3029
}
3130
}
32-
33-
return f[length, 0, 0];
31+
f[i, j, k] = -1;
32+
return false;
3433
}
3534
}
Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,28 @@
11
func isScramble(s1 string, s2 string) bool {
22
n := len(s1)
3-
dp := make([][][]bool, n+1)
4-
for i := range dp {
5-
dp[i] = make([][]bool, n)
6-
for j := range dp[i] {
7-
dp[i][j] = make([]bool, n+1)
3+
f := make([][][]int, n)
4+
for i := range f {
5+
f[i] = make([][]int, n)
6+
for j := range f[i] {
7+
f[i][j] = make([]int, n+1)
88
}
99
}
10-
for i := 0; i < n; i++ {
11-
for j := 0; j < n; j++ {
12-
dp[i][j][1] = s1[i] == s2[j]
10+
var dfs func(i, j, k int) bool
11+
dfs = func(i, j, k int) bool {
12+
if k == 1 {
13+
return s1[i] == s2[j]
1314
}
14-
}
15-
for l := 2; l < n+1; l++ {
16-
for i1 := 0; i1 < n-l+1; i1++ {
17-
for i2 := 0; i2 < n-l+1; i2++ {
18-
for i := 1; i < l; i++ {
19-
if dp[i1][i2][i] && dp[i1+i][i2+i][l-i] {
20-
dp[i1][i2][l] = true
21-
break
22-
}
23-
if dp[i1][i2+l-i][i] && dp[i1+i][i2][l-i] {
24-
dp[i1][i2][l] = true
25-
break
26-
}
27-
}
15+
if f[i][j][k] != 0 {
16+
return f[i][j][k] == 1
17+
}
18+
f[i][j][k] = 2
19+
for h := 1; h < k; h++ {
20+
if (dfs(i, j, h) && dfs(i+h, j+h, k-h)) || (dfs(i+h, j, k-h) && dfs(i, j+k-h, h)) {
21+
f[i][j][k] = 1
22+
return true
2823
}
2924
}
25+
return false
3026
}
31-
return dp[0][0][n]
32-
}
27+
return dfs(0, 0, n)
28+
}
Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,31 @@
11
class Solution {
2+
private Boolean[][][] f;
3+
private String s1;
4+
private String s2;
5+
26
public boolean isScramble(String s1, String s2) {
37
int n = s1.length();
4-
boolean[][][] dp = new boolean[n][n][n + 1];
5-
for (int i = 0; i < n; ++i) {
6-
for (int j = 0; j < n; ++j) {
7-
dp[i][j][1] = s1.charAt(i) == s2.charAt(j);
8-
}
8+
this.s1 = s1;
9+
this.s2 = s2;
10+
f = new Boolean[n][n][n + 1];
11+
return dfs(0, 0, n);
12+
}
13+
14+
private boolean dfs(int i, int j, int k) {
15+
if (f[i][j][k] != null) {
16+
return f[i][j][k];
917
}
10-
for (int len = 2; len <= n; ++len) {
11-
for (int i1 = 0; i1 <= n - len; ++i1) {
12-
for (int i2 = 0; i2 <= n - len; ++i2) {
13-
for (int i = 1; i < len; ++i) {
14-
if (dp[i1][i2][i] && dp[i1 + i][i2 + i][len - i]) {
15-
dp[i1][i2][len] = true;
16-
break;
17-
}
18-
if (dp[i1][i2 + len - i][i] && dp[i1 + i][i2][len - i]) {
19-
dp[i1][i2][len] = true;
20-
break;
21-
}
22-
}
23-
}
18+
if (k == 1) {
19+
return s1.charAt(i) == s2.charAt(j);
20+
}
21+
for (int h = 1; h < k; ++h) {
22+
if (dfs(i, j, h) && dfs(i + h, j + h, k - h)) {
23+
return f[i][j][k] = true;
24+
}
25+
if (dfs(i + h, j, k - h) && dfs(i, j + k - h, h)) {
26+
return f[i][j][k] = true;
2427
}
2528
}
26-
return dp[0][0][n];
29+
return f[i][j][k] = false;
2730
}
2831
}
Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
class Solution:
22
def isScramble(self, s1: str, s2: str) -> bool:
3-
n = len(s1)
4-
dp = [[[False] * (n + 1) for _ in range(n)] for _ in range(n)]
5-
for i in range(n):
6-
for j in range(n):
7-
dp[i][j][1] = s1[i] == s2[j]
8-
for l in range(2, n + 1):
9-
for i1 in range(n - l + 1):
10-
for i2 in range(n - l + 1):
11-
for i in range(1, l):
12-
if dp[i1][i2][i] and dp[i1 + i][i2 + i][l - i]:
13-
dp[i1][i2][l] = True
14-
break
15-
if dp[i1][i2 + l - i][i] and dp[i1 + i][i2][l - i]:
16-
dp[i1][i2][l] = True
17-
break
18-
return dp[0][0][n]
3+
@cache
4+
def dfs(i: int, j: int, k: int) -> bool:
5+
if k == 1:
6+
return s1[i] == s2[j]
7+
for h in range(1, k):
8+
if dfs(i, j, h) and dfs(i + h, j + h, k - h):
9+
return True
10+
if dfs(i + h, j, k - h) and dfs(i, j + k - h, h):
11+
return True
12+
return False
13+
14+
return dfs(0, 0, len(s1))
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
function isScramble(s1: string, s2: string): boolean {
2+
const n = s1.length;
3+
const f = new Array(n)
4+
.fill(0)
5+
.map(() => new Array(n).fill(0).map(() => new Array(n + 1).fill(-1)));
6+
const dfs = (i: number, j: number, k: number): boolean => {
7+
if (f[i][j][k] !== -1) {
8+
return f[i][j][k] === 1;
9+
}
10+
if (k === 1) {
11+
return s1[i] === s2[j];
12+
}
13+
for (let h = 1; h < k; ++h) {
14+
if (dfs(i, j, h) && dfs(i + h, j + h, k - h)) {
15+
return Boolean((f[i][j][k] = 1));
16+
}
17+
if (dfs(i + h, j, k - h) && dfs(i, j + k - h, h)) {
18+
return Boolean((f[i][j][k] = 1));
19+
}
20+
}
21+
return Boolean((f[i][j][k] = 0));
22+
};
23+
return dfs(0, 0, n);
24+
}
Binary file not shown.

0 commit comments

Comments
 (0)