File tree 4 files changed +72
-2
lines changed
solution/0000-0099/0087.Scramble String
4 files changed +72
-2
lines changed Original file line number Diff line number Diff line change @@ -63,14 +63,45 @@ r g ta e
63
63
64
64
<!-- 这里可写通用的实现逻辑 -->
65
65
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
+
66
76
<!-- tabs:start -->
67
77
68
78
### ** Python3**
69
79
70
80
<!-- 这里可写当前语言的特殊实现逻辑 -->
71
81
72
82
``` 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]
74
105
```
75
106
76
107
### ** Java**
@@ -89,9 +120,13 @@ class Solution {
89
120
dp[i][j][1 ] = s1. charAt(i) == s2. charAt(j);
90
121
}
91
122
}
123
+ // 枚举长度区间[2, n]
92
124
for (int len = 2 ; len <= n; ++ len) {
125
+ // 枚举s1的起始位置
93
126
for (int i1 = 0 ; i1 <= n - len; ++ i1) {
127
+ // 枚举s2的起始位置
94
128
for (int i2 = 0 ; i2 <= n - len; ++ i2) {
129
+ // 枚举分割的位置
95
130
for (int i = 1 ; i < len; ++ i) {
96
131
if (dp[i1][i2][i] && dp[i1 + i][i2 + i][len - i]) {
97
132
dp[i1][i2][len] = true ;
Original file line number Diff line number Diff line change @@ -99,7 +99,24 @@ r g ta e
99
99
### ** Python3**
100
100
101
101
``` 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]
103
120
```
104
121
105
122
### ** Java**
Original file line number Diff line number Diff line change
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 ]
You can’t perform that action at this time.
0 commit comments