Skip to content

Commit c3c253c

Browse files
committed
feat: update leetcode solutions: No.0087. Scramble String
1 parent e377fe4 commit c3c253c

File tree

3 files changed

+80
-17
lines changed

3 files changed

+80
-17
lines changed

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

+30-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,36 @@ r g ta e
7878
<!-- 这里可写当前语言的特殊实现逻辑 -->
7979

8080
```java
81-
81+
class Solution {
82+
public boolean isScramble(String s1, String s2) {
83+
// 题目已说明 s1.length == s2.length,无须再判断长度是否相等
84+
int n = s1.length();
85+
boolean[][][] dp = new boolean[n][n][n + 1];
86+
for (int i = 0; i < n; ++i) {
87+
for (int j = 0; j < n; ++j) {
88+
// 长度为1时,两字符必须相等
89+
dp[i][j][1] = s1.charAt(i) == s2.charAt(j);
90+
}
91+
}
92+
for (int len = 2; len <= n; ++len) {
93+
for (int i1 = 0; i1 <= n - len; ++i1) {
94+
for (int i2 = 0; i2 <= n - len; ++i2) {
95+
for (int i = 1; i < len; ++i) {
96+
if (dp[i1][i2][i] && dp[i1 + i][i2 + i][len - i]) {
97+
dp[i1][i2][len] = true;
98+
break;
99+
}
100+
if (dp[i1][i2 + len - i][i] && dp[i1 + i][i2][len - i]) {
101+
dp[i1][i2][len] = true;
102+
break;
103+
}
104+
}
105+
}
106+
}
107+
}
108+
return dp[0][0][n];
109+
}
110+
}
82111
```
83112

84113
### **...**

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

+28-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,34 @@ r g ta e
105105
### **Java**
106106

107107
```java
108-
108+
class Solution {
109+
public boolean isScramble(String s1, String s2) {
110+
int n = s1.length();
111+
boolean[][][] dp = new boolean[n][n][n + 1];
112+
for (int i = 0; i < n; ++i) {
113+
for (int j = 0; j < n; ++j) {
114+
dp[i][j][1] = s1.charAt(i) == s2.charAt(j);
115+
}
116+
}
117+
for (int len = 2; len <= n; ++len) {
118+
for (int i1 = 0; i1 <= n - len; ++i1) {
119+
for (int i2 = 0; i2 <= n - len; ++i2) {
120+
for (int i = 1; i < len; ++i) {
121+
if (dp[i1][i2][i] && dp[i1 + i][i2 + i][len - i]) {
122+
dp[i1][i2][len] = true;
123+
break;
124+
}
125+
if (dp[i1][i2 + len - i][i] && dp[i1 + i][i2][len - i]) {
126+
dp[i1][i2][len] = true;
127+
break;
128+
}
129+
}
130+
}
131+
}
132+
}
133+
return dp[0][0][n];
134+
}
135+
}
109136
```
110137

111138
### **...**
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,28 @@
11
class Solution {
22
public boolean isScramble(String s1, String s2) {
3-
if(s1.equals(s2)) return true;
4-
if(s1.length()!=s2.length()) return false;
5-
int len = s1.length();
6-
int[] count = new int[26];
7-
for(int i = 0; i < len; i++){
8-
count[s1.charAt(i) - 'a']++;
9-
count[s2.charAt(i) - 'a']--;
3+
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+
}
109
}
11-
for(int item : count) if (item != 0) return false;
12-
for(int i = 1; i <= len - 1; i++){
13-
if(isScramble(s1.substring(0, i), s2.substring(0, i)) && isScramble(s1.substring(i), s2.substring(i)))
14-
return true;
15-
if (isScramble(s1.substring(0, i), s2.substring(len - i)) &&
16-
isScramble(s1.substring(i), s2.substring(0, len - i)))
17-
return true;
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+
}
24+
}
1825
}
19-
return false;
26+
return dp[0][0][n];
2027
}
2128
}

0 commit comments

Comments
 (0)