Skip to content

Commit cb8f786

Browse files
committed
feat: update leecode solutions: No.0087. Scramble String
1 parent c7359c8 commit cb8f786

File tree

4 files changed

+72
-2
lines changed

4 files changed

+72
-2
lines changed

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

+36-1
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,45 @@ r g ta e
6363

6464
<!-- 这里可写通用的实现逻辑 -->
6565

66+
动态规划法。
67+
68+
假设 `dp[i][j][len]` 表示从字符串 S 中 i 开始长度为 len 的字符串是否能变换为从字符串 T 中 j 开始长度为 len 的字符串。题目可转变为求 `dp[0][0][n]`
69+
70+
`len` 为 1 的情况下,只需要判断 `S[i]` 是否等于 `T[j]`。所以可以对 dp 进行初始化:`dp[i][j][1] = S[i] == T[j]`,其中,`i,j ∈ [0, n)`
71+
72+
`len` 大于 1 的情况下,枚举 S 的长度 `i ∈ [1, len-1]``dp[i1][i2][i]` 表示 S1 能变成 T1,`dp[i1 + i][i2 + i][len - i]` 表示 S2 能变成 T2;或者 S1 能变成 T2,S2 能变成 T1。
73+
74+
![](./images/demo.png)
75+
6676
<!-- tabs:start -->
6777

6878
### **Python3**
6979

7080
<!-- 这里可写当前语言的特殊实现逻辑 -->
7181

7282
```python
73-
83+
class Solution:
84+
def isScramble(self, s1: str, s2: str) -> bool:
85+
n = len(s1)
86+
dp = [[[False] * (n + 1) for _ in range(n)] for _ in range(n)]
87+
for i in range(n):
88+
for j in range(n):
89+
dp[i][j][1] = s1[i] == s2[j]
90+
# 枚举长度区间[2, n]
91+
for l in range(2, n + 1):
92+
# 枚举s1的起始位置
93+
for i1 in range(n - l + 1):
94+
# 枚举s2的起始位置
95+
for i2 in range(n - l + 1):
96+
# 枚举分割的位置
97+
for i in range(1, l):
98+
if dp[i1][i2][i] and dp[i1 + i][i2 + i][l - i]:
99+
dp[i1][i2][l] = True
100+
break
101+
if dp[i1][i2 + l - i][i] and dp[i1 + i][i2][l - i]:
102+
dp[i1][i2][l] = True
103+
break
104+
return dp[0][0][n]
74105
```
75106

76107
### **Java**
@@ -89,9 +120,13 @@ class Solution {
89120
dp[i][j][1] = s1.charAt(i) == s2.charAt(j);
90121
}
91122
}
123+
// 枚举长度区间[2, n]
92124
for (int len = 2; len <= n; ++len) {
125+
// 枚举s1的起始位置
93126
for (int i1 = 0; i1 <= n - len; ++i1) {
127+
// 枚举s2的起始位置
94128
for (int i2 = 0; i2 <= n - len; ++i2) {
129+
// 枚举分割的位置
95130
for (int i = 1; i < len; ++i) {
96131
if (dp[i1][i2][i] && dp[i1 + i][i2 + i][len - i]) {
97132
dp[i1][i2][len] = true;

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

+18-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,24 @@ r g ta e
9999
### **Python3**
100100

101101
```python
102-
102+
class Solution:
103+
def isScramble(self, s1: str, s2: str) -> bool:
104+
n = len(s1)
105+
dp = [[[False] * (n + 1) for _ in range(n)] for _ in range(n)]
106+
for i in range(n):
107+
for j in range(n):
108+
dp[i][j][1] = s1[i] == s2[j]
109+
for l in range(2, n + 1):
110+
for i1 in range(n - l + 1):
111+
for i2 in range(n - l + 1):
112+
for i in range(1, l):
113+
if dp[i1][i2][i] and dp[i1 + i][i2 + i][l - i]:
114+
dp[i1][i2][l] = True
115+
break
116+
if dp[i1][i2 + l - i][i] and dp[i1 + i][i2][l - i]:
117+
dp[i1][i2][l] = True
118+
break
119+
return dp[0][0][n]
103120
```
104121

105122
### **Java**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution:
2+
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]
Loading

0 commit comments

Comments
 (0)