Skip to content

Commit 3509c0b

Browse files
authored
feat: add typescript solution to lc problem: No.2060 (#607)
No.2060.Check if an Original String Exists Given Two Encoded Strings
1 parent 09c9ac4 commit 3509c0b

File tree

3 files changed

+191
-0
lines changed

3 files changed

+191
-0
lines changed

solution/2000-2099/2060.Check if an Original String Exists Given Two Encoded Strings/README.md

+66
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@
105105

106106
<!-- 这里可写通用的实现逻辑 -->
107107

108+
动态规划
109+
108110
<!-- tabs:start -->
109111

110112
### **Python3**
@@ -123,6 +125,70 @@
123125

124126
```
125127

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+
126192
### **...**
127193

128194
```

solution/2000-2099/2060.Check if an Original String Exists Given Two Encoded Strings/README_EN.md

+66
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@
104104

105105
## Solutions
106106

107+
Dynamic Programming
108+
107109
<!-- tabs:start -->
108110

109111
### **Python3**
@@ -118,6 +120,70 @@
118120

119121
```
120122

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+
121187
### **...**
122188

123189
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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+
}

0 commit comments

Comments
 (0)