Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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‎

Lines changed: 36 additions & 1 deletion
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‎

Lines changed: 18 additions & 1 deletion
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**
Lines changed: 18 additions & 0 deletions
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]
87.3 KB
Loading[フレーム]

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /