Skip to content

Commit 173bc81

Browse files
authored
feat: add solutions to lc problems: No.0541,0542 (doocs#3317)
1 parent 04a84f3 commit 173bc81

File tree

11 files changed

+198
-161
lines changed

11 files changed

+198
-161
lines changed

solution/0500-0599/0541.Reverse String II/README.md

+40-18
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,11 @@ tags:
5656

5757
<!-- solution:start -->
5858

59-
### 方法一
59+
### 方法一:双指针
60+
61+
我们可以遍历字符串 $\textit{s}$,每次遍历 $\textit{2k}$ 个字符,然后利用双指针技巧,对这 $\textit{2k}$ 个字符中的前 $\textit{k}$ 个字符进行反转。
62+
63+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为字符串 $\textit{s}$ 的长度。
6064

6165
<!-- tabs:start -->
6266

@@ -65,26 +69,27 @@ tags:
6569
```python
6670
class Solution:
6771
def reverseStr(self, s: str, k: int) -> str:
68-
t = list(s)
69-
for i in range(0, len(t), k << 1):
70-
t[i : i + k] = reversed(t[i : i + k])
71-
return ''.join(t)
72+
cs = list(s)
73+
for i in range(0, len(cs), 2 * k):
74+
cs[i : i + k] = reversed(cs[i : i + k])
75+
return "".join(cs)
7276
```
7377

7478
#### Java
7579

7680
```java
7781
class Solution {
7882
public String reverseStr(String s, int k) {
79-
char[] chars = s.toCharArray();
80-
for (int i = 0; i < chars.length; i += (k << 1)) {
81-
for (int st = i, ed = Math.min(chars.length - 1, i + k - 1); st < ed; ++st, --ed) {
82-
char t = chars[st];
83-
chars[st] = chars[ed];
84-
chars[ed] = t;
83+
char[] cs = s.toCharArray();
84+
int n = cs.length;
85+
for (int i = 0; i < n; i += k * 2) {
86+
for (int l = i, r = Math.min(i + k - 1, n - 1); l < r; ++l, --r) {
87+
char t = cs[l];
88+
cs[l] = cs[r];
89+
cs[r] = t;
8590
}
8691
}
87-
return new String(chars);
92+
return new String(cs);
8893
}
8994
}
9095
```
@@ -95,7 +100,8 @@ class Solution {
95100
class Solution {
96101
public:
97102
string reverseStr(string s, int k) {
98-
for (int i = 0, n = s.size(); i < n; i += (k << 1)) {
103+
int n = s.size();
104+
for (int i = 0; i < n; i += 2 * k) {
99105
reverse(s.begin() + i, s.begin() + min(i + k, n));
100106
}
101107
return s;
@@ -107,13 +113,29 @@ public:
107113
108114
```go
109115
func reverseStr(s string, k int) string {
110-
t := []byte(s)
111-
for i := 0; i < len(t); i += (k << 1) {
112-
for st, ed := i, min(i+k-1, len(t)-1); st < ed; st, ed = st+1, ed-1 {
113-
t[st], t[ed] = t[ed], t[st]
116+
cs := []byte(s)
117+
n := len(cs)
118+
for i := 0; i < n; i += 2 * k {
119+
for l, r := i, min(i+k-1, n-1); l < r; l, r = l+1, r-1 {
120+
cs[l], cs[r] = cs[r], cs[l]
114121
}
115122
}
116-
return string(t)
123+
return string(cs)
124+
}
125+
```
126+
127+
#### TypeScript
128+
129+
```ts
130+
function reverseStr(s: string, k: number): string {
131+
const n = s.length;
132+
const cs = s.split('');
133+
for (let i = 0; i < n; i += 2 * k) {
134+
for (let l = i, r = Math.min(i + k - 1, n - 1); l < r; l++, r--) {
135+
[cs[l], cs[r]] = [cs[r], cs[l]];
136+
}
137+
}
138+
return cs.join('');
117139
}
118140
```
119141

solution/0500-0599/0541.Reverse String II/README_EN.md

+40-18
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ tags:
4444

4545
<!-- solution:start -->
4646

47-
### Solution 1
47+
### Solution 1: Two Pointers
48+
49+
We can traverse the string $\textit{s}$, iterating over every $\textit{2k}$ characters, and then use the two-pointer technique to reverse the first $\textit{k}$ characters among these $\textit{2k}$ characters.
50+
51+
The time complexity is $O(n)$, and the space complexity is $O(n)$. Here, $n$ is the length of the string $\textit{s}$.
4852

4953
<!-- tabs:start -->
5054

@@ -53,26 +57,27 @@ tags:
5357
```python
5458
class Solution:
5559
def reverseStr(self, s: str, k: int) -> str:
56-
t = list(s)
57-
for i in range(0, len(t), k << 1):
58-
t[i : i + k] = reversed(t[i : i + k])
59-
return ''.join(t)
60+
cs = list(s)
61+
for i in range(0, len(cs), 2 * k):
62+
cs[i : i + k] = reversed(cs[i : i + k])
63+
return "".join(cs)
6064
```
6165

6266
#### Java
6367

6468
```java
6569
class Solution {
6670
public String reverseStr(String s, int k) {
67-
char[] chars = s.toCharArray();
68-
for (int i = 0; i < chars.length; i += (k << 1)) {
69-
for (int st = i, ed = Math.min(chars.length - 1, i + k - 1); st < ed; ++st, --ed) {
70-
char t = chars[st];
71-
chars[st] = chars[ed];
72-
chars[ed] = t;
71+
char[] cs = s.toCharArray();
72+
int n = cs.length;
73+
for (int i = 0; i < n; i += k * 2) {
74+
for (int l = i, r = Math.min(i + k - 1, n - 1); l < r; ++l, --r) {
75+
char t = cs[l];
76+
cs[l] = cs[r];
77+
cs[r] = t;
7378
}
7479
}
75-
return new String(chars);
80+
return new String(cs);
7681
}
7782
}
7883
```
@@ -83,7 +88,8 @@ class Solution {
8388
class Solution {
8489
public:
8590
string reverseStr(string s, int k) {
86-
for (int i = 0, n = s.size(); i < n; i += (k << 1)) {
91+
int n = s.size();
92+
for (int i = 0; i < n; i += 2 * k) {
8793
reverse(s.begin() + i, s.begin() + min(i + k, n));
8894
}
8995
return s;
@@ -95,13 +101,29 @@ public:
95101
96102
```go
97103
func reverseStr(s string, k int) string {
98-
t := []byte(s)
99-
for i := 0; i < len(t); i += (k << 1) {
100-
for st, ed := i, min(i+k-1, len(t)-1); st < ed; st, ed = st+1, ed-1 {
101-
t[st], t[ed] = t[ed], t[st]
104+
cs := []byte(s)
105+
n := len(cs)
106+
for i := 0; i < n; i += 2 * k {
107+
for l, r := i, min(i+k-1, n-1); l < r; l, r = l+1, r-1 {
108+
cs[l], cs[r] = cs[r], cs[l]
102109
}
103110
}
104-
return string(t)
111+
return string(cs)
112+
}
113+
```
114+
115+
#### TypeScript
116+
117+
```ts
118+
function reverseStr(s: string, k: number): string {
119+
const n = s.length;
120+
const cs = s.split('');
121+
for (let i = 0; i < n; i += 2 * k) {
122+
for (let l = i, r = Math.min(i + k - 1, n - 1); l < r; l++, r--) {
123+
[cs[l], cs[r]] = [cs[r], cs[l]];
124+
}
125+
}
126+
return cs.join('');
105127
}
106128
```
107129

solution/0500-0599/0541.Reverse String II/Solution.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
class Solution {
22
public:
33
string reverseStr(string s, int k) {
4-
for (int i = 0, n = s.size(); i < n; i += (k << 1)) {
4+
int n = s.size();
5+
for (int i = 0; i < n; i += 2 * k) {
56
reverse(s.begin() + i, s.begin() + min(i + k, n));
67
}
78
return s;
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
func reverseStr(s string, k int) string {
2-
t := []byte(s)
3-
for i := 0; i < len(t); i += (k << 1) {
4-
for st, ed := i, min(i+k-1, len(t)-1); st < ed; st, ed = st+1, ed-1 {
5-
t[st], t[ed] = t[ed], t[st]
2+
cs := []byte(s)
3+
n := len(cs)
4+
for i := 0; i < n; i += 2 * k {
5+
for l, r := i, min(i+k-1, n-1); l < r; l, r = l+1, r-1 {
6+
cs[l], cs[r] = cs[r], cs[l]
67
}
78
}
8-
return string(t)
9+
return string(cs)
910
}
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
class Solution {
22
public String reverseStr(String s, int k) {
3-
char[] chars = s.toCharArray();
4-
for (int i = 0; i < chars.length; i += (k << 1)) {
5-
for (int st = i, ed = Math.min(chars.length - 1, i + k - 1); st < ed; ++st, --ed) {
6-
char t = chars[st];
7-
chars[st] = chars[ed];
8-
chars[ed] = t;
3+
char[] cs = s.toCharArray();
4+
int n = cs.length;
5+
for (int i = 0; i < n; i += k * 2) {
6+
for (int l = i, r = Math.min(i + k - 1, n - 1); l < r; ++l, --r) {
7+
char t = cs[l];
8+
cs[l] = cs[r];
9+
cs[r] = t;
910
}
1011
}
11-
return new String(chars);
12+
return new String(cs);
1213
}
1314
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
class Solution:
22
def reverseStr(self, s: str, k: int) -> str:
3-
t = list(s)
4-
for i in range(0, len(t), k << 1):
5-
t[i : i + k] = reversed(t[i : i + k])
6-
return ''.join(t)
3+
cs = list(s)
4+
for i in range(0, len(cs), 2 * k):
5+
cs[i : i + k] = reversed(cs[i : i + k])
6+
return "".join(cs)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
function reverseStr(s: string, k: number): string {
2+
const n = s.length;
3+
const cs = s.split('');
4+
for (let i = 0; i < n; i += 2 * k) {
5+
for (let l = i, r = Math.min(i + k - 1, n - 1); l < r; l++, r--) {
6+
[cs[l], cs[r]] = [cs[r], cs[l]];
7+
}
8+
}
9+
return cs.join('');
10+
}

solution/0500-0599/0542.01 Matrix/README.md

+32-38
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,17 @@ tags:
6262

6363
<!-- solution:start -->
6464

65-
### 方法一:多源 BFS
65+
### 方法一:BFS
6666

67-
初始化结果矩阵 ans,所有 0 的距离为 0,所以 1 的距离为 -1。初始化队列 q 存储 BFS 需要检查的位置,并将所有 0 的位置入队
67+
我们创建一个大小和 $\textit{mat}$ 一样的矩阵 $\textit{ans}$,并将所有的元素初始化为 $-1$
6868

69-
循环弹出队列 q 的元素 `p(i, j)`,检查邻居四个点。对于邻居 `(x, y)`,如果 `ans[x][y] = -1`,则更新 `ans[x][y] = ans[i][j] + 1`。同时将 `(x, y)` 入队。
69+
然后我们遍历 $\textit{mat}$,将所有的 $0$ 元素的坐标 $(i, j)$ 加入队列 $\textit{q}$,并将 $\textit{ans}[i][j]$ 设为 $0$。
70+
71+
接下来,我们使用广度优先搜索,从队列中取出一个元素 $(i, j)$,并遍历其四个方向,如果该方向的元素 $(x, y)$ 满足 $0 \leq x < m$, $0 \leq y < n$ 且 $\textit{ans}[x][y] = -1$,则将 $\textit{ans}[x][y]$ 设为 $\textit{ans}[i][j] + 1$,并将 $(x, y)$ 加入队列 $\textit{q}$。
72+
73+
最后返回 $\textit{ans}$。
74+
75+
时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别为矩阵 $\textit{mat}$ 的行数和列数。
7076

7177
<!-- tabs:start -->
7278

@@ -219,8 +225,7 @@ function updateMatrix(mat: number[][]): number[][] {
219225
}
220226
}
221227
const dirs: number[] = [-1, 0, 1, 0, -1];
222-
while (q.length) {
223-
const [i, j] = q.shift()!;
228+
for (const [i, j] of q) {
224229
for (let k = 0; k < 4; ++k) {
225230
const [x, y] = [i + dirs[k], j + dirs[k + 1]];
226231
if (x >= 0 && x < m && y >= 0 && y < n && ans[x][y] === -1) {
@@ -239,49 +244,38 @@ function updateMatrix(mat: number[][]): number[][] {
239244
use std::collections::VecDeque;
240245

241246
impl Solution {
242-
#[allow(dead_code)]
243247
pub fn update_matrix(mat: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
244-
let n: usize = mat.len();
245-
let m: usize = mat[0].len();
246-
let mut ret_vec: Vec<Vec<i32>> = vec![vec![-1; m]; n];
247-
// The inner tuple is of <X, Y, Current Count>
248-
let mut the_q: VecDeque<(usize, usize)> = VecDeque::new();
249-
let traverse_vec: Vec<(i32, i32)> = vec![(-1, 0), (1, 0), (0, 1), (0, -1)];
250-
251-
// Initialize the queue
252-
for i in 0..n {
253-
for j in 0..m {
248+
let m = mat.len();
249+
let n = mat[0].len();
250+
let mut ans = vec![vec![-1; n]; m];
251+
let mut q = VecDeque::new();
252+
253+
for i in 0..m {
254+
for j in 0..n {
254255
if mat[i][j] == 0 {
255-
// For the zero cell, enqueue at first
256-
the_q.push_back((i, j));
257-
// Set to 0 in return vector
258-
ret_vec[i][j] = 0;
256+
q.push_back((i, j));
257+
ans[i][j] = 0;
259258
}
260259
}
261260
}
262261

263-
while !the_q.is_empty() {
264-
let (x, y) = the_q.front().unwrap().clone();
265-
the_q.pop_front();
266-
for pair in &traverse_vec {
267-
let cur_x = pair.0 + (x as i32);
268-
let cur_y = pair.1 + (y as i32);
269-
if Solution::check_bounds(cur_x, cur_y, n as i32, m as i32)
270-
&& ret_vec[cur_x as usize][cur_y as usize] == -1
271-
{
272-
// The current cell has not be updated yet, and is also in bound
273-
ret_vec[cur_x as usize][cur_y as usize] = ret_vec[x][y] + 1;
274-
the_q.push_back((cur_x as usize, cur_y as usize));
262+
let dirs = [-1, 0, 1, 0, -1];
263+
while let Some((i, j)) = q.pop_front() {
264+
for k in 0..4 {
265+
let x = i as isize + dirs[k];
266+
let y = j as isize + dirs[k + 1];
267+
if x >= 0 && x < m as isize && y >= 0 && y < n as isize {
268+
let x = x as usize;
269+
let y = y as usize;
270+
if ans[x][y] == -1 {
271+
ans[x][y] = ans[i][j] + 1;
272+
q.push_back((x, y));
273+
}
275274
}
276275
}
277276
}
278277

279-
ret_vec
280-
}
281-
282-
#[allow(dead_code)]
283-
pub fn check_bounds(i: i32, j: i32, n: i32, m: i32) -> bool {
284-
i >= 0 && i < n && j >= 0 && j < m
278+
ans
285279
}
286280
}
287281
```

0 commit comments

Comments
 (0)