File tree Expand file tree Collapse file tree 4 files changed +72
-2
lines changed
solution/0000-0099/0087.Scramble String Expand file tree Collapse file tree 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
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 ;
Original file line number Diff line number Diff 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 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