Skip to content

Commit 2d1ee6d

Browse files
committed
feat: leetcode 383
1 parent e29d7da commit 2d1ee6d

File tree

8 files changed

+137
-2
lines changed

8 files changed

+137
-2
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<p align="center">
44
<!-- TOPICS COUNT START -->
5-
<img src="https://img.shields.io/badge/-进度:417-green" alt="进度:417">
5+
<img src="https://img.shields.io/badge/-进度:418-green" alt="进度:418">
66
<!-- TOPICS COUNT END -->
77
<a href="./assets/docs/TOPICS.md"><img src="https://img.shields.io/badge/-题库目录-blue" alt="题库目录"></a>
88
<a href="./assets/docs/CATEGORIES.md"><img src="https://img.shields.io/badge/-题库分类-red" alt="题库分类"></a>

assets/data/categories.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,12 @@
176176
"path": "./problemset/insert-delete-getrandom-o1/README.md",
177177
"difficulty": "中等"
178178
},
179+
{
180+
"id": "383",
181+
"title": "赎金信",
182+
"path": "./problemset/ransom-note/README.md",
183+
"difficulty": "简单"
184+
},
179185
{
180186
"id": "398",
181187
"title": "随机数索引",

assets/data/topics.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2709,6 +2709,16 @@
27092709
"url": "https://leetcode-cn.com/problems/insert-delete-getrandom-o1/",
27102710
"path": "./problemset/insert-delete-getrandom-o1/README.md"
27112711
},
2712+
{
2713+
"id": "383",
2714+
"title": {
2715+
"cn": "赎金信",
2716+
"en": "ransom-note"
2717+
},
2718+
"difficulty": "简单",
2719+
"url": "https://leetcode.cn/problems/ransom-note/",
2720+
"path": "./problemset/ransom-note/README.md"
2721+
},
27122722
{
27132723
"id": "385",
27142724
"title": {
@@ -4169,4 +4179,4 @@
41694179
"url": "https://leetcode.cn/problems/JEj789/",
41704180
"path": "./problemset/paint-house/README.md"
41714181
}
4172-
]
4182+
]

assets/docs/CATEGORIES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
| 290. [单词规律](../../problemset/word-pattern/README.md) | 简单 |
3434
| 355. [设计推特](../../problemset/design-twitter/README.md) | 中等 |
3535
| 380. [O(1) 时间插入、删除和获取随机元素](../../problemset/insert-delete-getrandom-o1/README.md) | 中等 |
36+
| 383. [赎金信](../../problemset/ransom-note/README.md) | 简单 |
3637
| 398. [随机数索引](../../problemset/random-pick-index/README.md) | 中等 |
3738
| 432. [全 O(1) 的数据结构](../../problemset/all-one-data-structure/README.md) | 困难 |
3839
| 532. [数组中的 k-diff 数对](../../problemset/k-diff-pairs-in-an-array/README.md) | 中等 |

assets/docs/TOPICS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,8 @@
542542

543543
[380. O(1) 时间插入、删除和获取随机元素](../../problemset/insert-delete-getrandom-o1/README.md)
544544

545+
[383. 赎金信](../../problemset/ransom-note/README.md)
546+
545547
[385. 迷你语法分析器](../../problemset/mini-parser/README.md)
546548

547549
[386. 字典序排数](../../problemset/lexicographical-numbers/README.md)

problemset/ransom-note/README.md

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# 赎金信
2+
3+
> 简单
4+
>
5+
> https://leetcode.cn/problems/ransom-note/
6+
7+
## 题目
8+
9+
给你两个字符串:`ransomNote``magazine` ,判断 `ransomNote` 能不能由` magazine` 里面的字符构成。
10+
11+
如果可以,返回 `true` ;否则返回 `false`
12+
13+
`magazine` 中的每个字符只能在 `ransomNote` 中使用一次。
14+
15+
### 示例
16+
17+
#### 示例 1:
18+
19+
```
20+
输入:ransomNote = "a", magazine = "b"
21+
输出:false
22+
```
23+
24+
#### 示例 2:
25+
```
26+
输入:ransomNote = "aa", magazine = "ab"
27+
输出:false
28+
```
29+
30+
#### 示例 3:
31+
32+
```
33+
输入:ransomNote = "aa", magazine = "aab"
34+
输出:true
35+
```
36+
37+
## 解题
38+
39+
```ts
40+
/**
41+
* 哈希表
42+
* @desc 时间复杂度 O(N + M) 空间复杂度 O(S)
43+
* @param ransomNote
44+
* @param magazine
45+
* @returns
46+
*/
47+
export function canConstruct(ransomNote: string, magazine: string): boolean {
48+
const map = new Map<string, number>()
49+
50+
for (const ch of magazine)
51+
map.set(ch, (map.get(ch) || 0) + 1)
52+
53+
for (const ch of ransomNote) {
54+
if (!map.has(ch))
55+
return false
56+
else if (map.get(ch) === 1)
57+
map.delete(ch)
58+
else
59+
map.set(ch, map.get(ch)! - 1)
60+
}
61+
62+
return true
63+
}
64+
```

problemset/ransom-note/index.spec.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { describe, expect, it } from 'vitest'
2+
import { canConstruct } from '.'
3+
4+
describe('赎金信', () => {
5+
testCase(canConstruct)
6+
})
7+
8+
function testCase(fn: (ransomNote: string, magazine: string) => boolean) {
9+
it.each([
10+
[
11+
'a',
12+
'b',
13+
false,
14+
],
15+
[
16+
'aa',
17+
'ab',
18+
false,
19+
],
20+
[
21+
'aa',
22+
'aab',
23+
true,
24+
],
25+
])('示例%#', (ransomNote, magazine, expected) => {
26+
expect(fn(ransomNote, magazine)).toBe(expected)
27+
})
28+
}

problemset/ransom-note/index.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* 哈希表
3+
* @desc 时间复杂度 O(N + M) 空间复杂度 O(S)
4+
* @param ransomNote
5+
* @param magazine
6+
* @returns
7+
*/
8+
export function canConstruct(ransomNote: string, magazine: string): boolean {
9+
const map = new Map<string, number>()
10+
11+
for (const ch of magazine)
12+
map.set(ch, (map.get(ch) || 0) + 1)
13+
14+
for (const ch of ransomNote) {
15+
if (!map.has(ch))
16+
return false
17+
else if (map.get(ch) === 1)
18+
map.delete(ch)
19+
else
20+
map.set(ch, map.get(ch)! - 1)
21+
}
22+
23+
return true
24+
}

0 commit comments

Comments
 (0)