File tree 3 files changed +191
-0
lines changed
solution/2000-2099/2060.Check if an Original String Exists Given Two Encoded Strings
3 files changed +191
-0
lines changed Original file line number Diff line number Diff line change 105
105
106
106
<!-- 这里可写通用的实现逻辑 -->
107
107
108
+ 动态规划
109
+
108
110
<!-- tabs:start -->
109
111
110
112
### ** Python3**
123
125
124
126
```
125
127
128
+ ### ** TypeScript**
129
+
130
+ ``` ts
131
+ function possiblyEquals(s1 : string , s2 : string ): boolean {
132
+ const n = s1 .length , m = s2 .length ;
133
+ let dp: Array <Array <Set <number >>> = Array .from ({ length: n + 1 }, v => Array .from ({ length: m + 1 }, w => new Set ()));
134
+ dp [0 ][0 ].add (0 );
135
+
136
+ for (let i = 0 ; i <= n ; i ++ ) {
137
+ for (let j = 0 ; j <= m ; j ++ ) {
138
+ for (let delta of dp [i ][j ]) {
139
+
140
+ // s1为数字
141
+ let num = 0 ;
142
+ if (delta <= 0 ) {
143
+ for (let p = i ; i < Math .min (i + 3 , n ); p ++ ) {
144
+ if (isDigit (s1 [p ])) {
145
+ num = num * 10 + Number (s1 [p ]);
146
+ dp [p + 1 ][j ].add (delta + num );
147
+ } else {
148
+ break ;
149
+ }
150
+ }
151
+ }
152
+
153
+ // s2为数字
154
+ num = 0 ;
155
+ if (delta >= 0 ) {
156
+ for (let q = j ; q < Math .min (j + 3 , m ); q ++ ) {
157
+ if (isDigit (s2 [q ])) {
158
+ num = num * 10 + Number (s2 [q ]);
159
+ dp [i ][q + 1 ].add (delta - num );
160
+ } else {
161
+ break ;
162
+ }
163
+ }
164
+ }
165
+
166
+ // 数字匹配s1为字母
167
+ if (i < n && delta < 0 && ! isDigit (s1 [i ])) {
168
+ dp [i + 1 ][j ].add (delta + 1 );
169
+ }
170
+
171
+ // 数字匹配s2为字母
172
+ if (j < m && delta > 0 && ! isDigit (s2 [j ])) {
173
+ dp [i ][j + 1 ].add (delta - 1 );
174
+ }
175
+
176
+ // 两个字母匹配
177
+ if (i < n && j < m && delta == 0 && s1 [i ] == s2 [j ]) {
178
+ dp [i + 1 ][j + 1 ].add (0 );
179
+ }
180
+
181
+ }
182
+ }
183
+ }
184
+ return dp [n ][m ].has (0 );
185
+ };
186
+
187
+ function isDigit(char : string ): boolean {
188
+ return (/ ^ \d {1} $ / g ).test (char );
189
+ }
190
+ ```
191
+
126
192
### ** ...**
127
193
128
194
```
Original file line number Diff line number Diff line change 104
104
105
105
## Solutions
106
106
107
+ Dynamic Programming
108
+
107
109
<!-- tabs:start -->
108
110
109
111
### ** Python3**
118
120
119
121
```
120
122
123
+ ### ** TypeScript**
124
+
125
+ ``` ts
126
+ function possiblyEquals(s1 : string , s2 : string ): boolean {
127
+ const n = s1 .length , m = s2 .length ;
128
+ let dp: Array <Array <Set <number >>> = Array .from ({ length: n + 1 }, v => Array .from ({ length: m + 1 }, w => new Set ()));
129
+ dp [0 ][0 ].add (0 );
130
+
131
+ for (let i = 0 ; i <= n ; i ++ ) {
132
+ for (let j = 0 ; j <= m ; j ++ ) {
133
+ for (let delta of dp [i ][j ]) {
134
+
135
+ // s1为数字
136
+ let num = 0 ;
137
+ if (delta <= 0 ) {
138
+ for (let p = i ; i < Math .min (i + 3 , n ); p ++ ) {
139
+ if (isDigit (s1 [p ])) {
140
+ num = num * 10 + Number (s1 [p ]);
141
+ dp [p + 1 ][j ].add (delta + num );
142
+ } else {
143
+ break ;
144
+ }
145
+ }
146
+ }
147
+
148
+ // s2为数字
149
+ num = 0 ;
150
+ if (delta >= 0 ) {
151
+ for (let q = j ; q < Math .min (j + 3 , m ); q ++ ) {
152
+ if (isDigit (s2 [q ])) {
153
+ num = num * 10 + Number (s2 [q ]);
154
+ dp [i ][q + 1 ].add (delta - num );
155
+ } else {
156
+ break ;
157
+ }
158
+ }
159
+ }
160
+
161
+ // 数字匹配s1为字母
162
+ if (i < n && delta < 0 && ! isDigit (s1 [i ])) {
163
+ dp [i + 1 ][j ].add (delta + 1 );
164
+ }
165
+
166
+ // 数字匹配s2为字母
167
+ if (j < m && delta > 0 && ! isDigit (s2 [j ])) {
168
+ dp [i ][j + 1 ].add (delta - 1 );
169
+ }
170
+
171
+ // 两个字母匹配
172
+ if (i < n && j < m && delta == 0 && s1 [i ] == s2 [j ]) {
173
+ dp [i + 1 ][j + 1 ].add (0 );
174
+ }
175
+
176
+ }
177
+ }
178
+ }
179
+ return dp [n ][m ].has (0 );
180
+ };
181
+
182
+ function isDigit(char : string ): boolean {
183
+ return (/ ^ \d {1} $ / g ).test (char );
184
+ }
185
+ ```
186
+
121
187
### ** ...**
122
188
123
189
```
Original file line number Diff line number Diff line change
1
+ function possiblyEquals ( s1 : string , s2 : string ) : boolean {
2
+ const n = s1 . length , m = s2 . length ;
3
+ let dp : Array < Array < Set < number > > > = Array . from ( { length : n + 1 } , v => Array . from ( { length : m + 1 } , w => new Set ( ) ) ) ;
4
+ dp [ 0 ] [ 0 ] . add ( 0 ) ;
5
+
6
+ for ( let i = 0 ; i <= n ; i ++ ) {
7
+ for ( let j = 0 ; j <= m ; j ++ ) {
8
+ for ( let delta of dp [ i ] [ j ] ) {
9
+
10
+ // s1为数字
11
+ let num = 0 ;
12
+ if ( delta <= 0 ) {
13
+ for ( let p = i ; i < Math . min ( i + 3 , n ) ; p ++ ) {
14
+ if ( isDigit ( s1 [ p ] ) ) {
15
+ num = num * 10 + Number ( s1 [ p ] ) ;
16
+ dp [ p + 1 ] [ j ] . add ( delta + num ) ;
17
+ } else {
18
+ break ;
19
+ }
20
+ }
21
+ }
22
+
23
+ // s2为数字
24
+ num = 0 ;
25
+ if ( delta >= 0 ) {
26
+ for ( let q = j ; q < Math . min ( j + 3 , m ) ; q ++ ) {
27
+ if ( isDigit ( s2 [ q ] ) ) {
28
+ num = num * 10 + Number ( s2 [ q ] ) ;
29
+ dp [ i ] [ q + 1 ] . add ( delta - num ) ;
30
+ } else {
31
+ break ;
32
+ }
33
+ }
34
+ }
35
+
36
+ // 数字匹配s1为字母
37
+ if ( i < n && delta < 0 && ! isDigit ( s1 [ i ] ) ) {
38
+ dp [ i + 1 ] [ j ] . add ( delta + 1 ) ;
39
+ }
40
+
41
+ // 数字匹配s2为字母
42
+ if ( j < m && delta > 0 && ! isDigit ( s2 [ j ] ) ) {
43
+ dp [ i ] [ j + 1 ] . add ( delta - 1 ) ;
44
+ }
45
+
46
+ // 两个字母匹配
47
+ if ( i < n && j < m && delta == 0 && s1 [ i ] == s2 [ j ] ) {
48
+ dp [ i + 1 ] [ j + 1 ] . add ( 0 ) ;
49
+ }
50
+
51
+ }
52
+ }
53
+ }
54
+ return dp [ n ] [ m ] . has ( 0 ) ;
55
+ } ;
56
+
57
+ function isDigit ( char : string ) : boolean {
58
+ return ( / ^ \d { 1 } $ / g) . test ( char ) ;
59
+ }
You can’t perform that action at this time.
0 commit comments