Skip to content

Commit 8980a51

Browse files
committed
feat: add solutions to lc problems
* No.0777.Swap Adjacent in LR String * No.2337.Move Pieces to Obtain a String
1 parent 133f887 commit 8980a51

File tree

13 files changed

+478
-81
lines changed

13 files changed

+478
-81
lines changed

solution/0600-0699/0647.Palindromic Substrings/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050

5151
**方法二:Manacher 算法**
5252

53-
在 Manacher 算法的计算过程中,$p[i]-1$ 表示以第 $i$ 位为中心的最大回文长度,以第 $i$ 位为中心的回文串数量为 $\left \lceil \frac{p[i]-1}{2} \right \rceil$。
53+
在 Manacher 算法的计算过程中,$p[i]-1$ 表示以第 $i$ 位为中心的最大回文长度,以第 $i$ 位为中心的回文串数量为 $\left \lceil \frac{p[i]-1}{2} \right \rceil$。
5454

5555
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是字符串 `s` 的长度。
5656

solution/0600-0699/0649.Dota2 Senate/README.md

-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
<ol>
1414
<li>
1515
<p><code>禁止一名参议员的权利</code>:</p>
16-
1716
<p>参议员可以让另一位参议员在这一轮和随后的几轮中丧失<strong>所有的权利</strong>。</p>
1817
</li>
1918
<li>

solution/0600-0699/0652.Find Duplicate Subtrees/README.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@
5151

5252
<!-- 这里可写通用的实现逻辑 -->
5353

54-
后序遍历,序列化每个子树,用哈希表判断序列化的字符串出现次数是否等于 2,若是,说明这棵子树重复。
54+
**方法一:后序遍历**
55+
56+
后序遍历,序列化每个子树,用哈希表判断序列化的字符串出现次数是否等于 `2`,若是,说明这棵子树重复。
5557

5658
<!-- tabs:start -->
5759

solution/0600-0699/0653.Two Sum IV - Input is a BST/README.md

+4
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,12 @@
3939

4040
<!-- 这里可写通用的实现逻辑 -->
4141

42+
**方法一:哈希表**
43+
4244
用哈希表记录访问过的节点。
4345

46+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是二叉树的节点个数。
47+
4448
<!-- tabs:start -->
4549

4650
### **Python3**

solution/0600-0699/0655.Print Binary Tree/README.md

+6-6
Original file line numberDiff line numberDiff line change
@@ -58,19 +58,19 @@
5858

5959
**方法一:两次 DFS**
6060

61-
先通过 $DFS$ 求二叉树的高度 $h$(高度从 $0$ 开始),然后根据 $h$ 求得结果列表的行数 $m$ 和列数 $n$。
61+
先通过 `DFS` 求二叉树的高度 $h$(高度从 `0` 开始),然后根据 $h$ 求得结果列表的行数 $m$ 和列数 $n$。
6262

63-
根据 $m$, $n$ 初始化结果列表 $ans$,然后 $DFS$ 遍历二叉树,依次在每个位置填入二叉树节点值(字符串形式)即可。
63+
根据 $m$, $n$ 初始化结果列表 `ans`,然后 `DFS` 遍历二叉树,依次在每个位置填入二叉树节点值(字符串形式)即可。
6464

65-
时间复杂度 $O(h \times 2^h)$,空间复杂度 $O(h)$。其中 $h$ 是二叉树的高度。忽略结果返回值的空间消耗。
65+
时间复杂度 $O(h\times 2^h)$,空间复杂度 $O(h)$。其中 $h$ 是二叉树的高度。忽略结果返回值的空间消耗。
6666

6767
**方法二:两次 BFS**
6868

69-
方法一中,我们是通过 $DFS$ 来求二叉树的高度,我们也可以改成 $BFS$ 的方式,逐层往下扩展,那么扩展的层数就是二叉树的高度。
69+
方法一中,我们是通过 `DFS` 来求二叉树的高度,我们也可以改成 `BFS` 的方式,逐层往下扩展,那么扩展的层数就是二叉树的高度。
7070

71-
同样,我们初始化结果列表 $ans$,然后 $BFS$ 遍历二叉树,依次在每个位置填入二叉树节点值(字符串形式)即可。
71+
同样,我们初始化结果列表 `ans`,然后 `BFS` 遍历二叉树,依次在每个位置填入二叉树节点值(字符串形式)即可。
7272

73-
时间复杂度 $O(h \times 2^h)$,空间复杂度 $O(h)$。其中 $h$ 是二叉树的高度。忽略结果返回值的空间消耗。
73+
时间复杂度 $O(h\times 2^h)$,空间复杂度 $O(h)$。其中 $h$ 是二叉树的高度。忽略结果返回值的空间消耗。
7474

7575
<!-- tabs:start -->
7676

solution/0700-0799/0777.Swap Adjacent in LR String/README.md

+109-1
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,130 @@ XRLXXRRLX
3636

3737
<!-- 这里可写通用的实现逻辑 -->
3838

39+
**方法一:双指针**
40+
41+
替换操作可以实际上是将 `L` 往左移动(`L` 左边为 `X` 时才能移动),`R` 往右移动(`R` 右边是 `X` 时才能移动),但 `L` 无法穿过 `R`。所以,如果去掉 `start``end` 中的所有 `X`,剩下的字符应该时相同的,否则返回 `false`
42+
43+
双指针遍历 `start``end`
44+
45+
- 如果当前字符为 `L` 且 $i\lt j$,那么这个 `L` 无法向右移动,返回 `false`
46+
- 如果当前字符为 `R` 且 $i\gt j$,那么这个 `R` 无法向左移动,返回 `false`
47+
48+
如果双指针均遍历到末尾,返回 `true`
49+
50+
时间复杂度 $O(n)$,其中 $n$ 表示字符串 `start``end` 的长度。
51+
52+
相似题目:[2337. 移动片段得到字符串](/solution/2300-2399/2337.Move%20Pieces%20to%20Obtain%20a%20String/README.md)
53+
3954
<!-- tabs:start -->
4055

4156
### **Python3**
4257

4358
<!-- 这里可写当前语言的特殊实现逻辑 -->
4459

4560
```python
46-
61+
class Solution:
62+
def canTransform(self, start: str, end: str) -> bool:
63+
n = len(start)
64+
i = j = 0
65+
while 1:
66+
while i < n and start[i] == 'X':
67+
i += 1
68+
while j < n and end[j] == 'X':
69+
j += 1
70+
if i >= n and j >= n:
71+
return True
72+
if i >= n or j >= n or start[i] != end[j]:
73+
return False
74+
if start[i] == 'L' and i < j:
75+
return False
76+
if start[i] == 'R' and i > j:
77+
return False
78+
i, j = i + 1, j + 1
4779
```
4880

4981
### **Java**
5082

5183
<!-- 这里可写当前语言的特殊实现逻辑 -->
5284

5385
```java
86+
class Solution {
87+
public boolean canTransform(String start, String end) {
88+
int n = start.length();
89+
int i = 0, j = 0;
90+
while (true) {
91+
while (i < n && start.charAt(i) == 'X') {
92+
++i;
93+
}
94+
while (j < n && end.charAt(j) == 'X') {
95+
++j;
96+
}
97+
if (i == n && j == n) {
98+
return true;
99+
}
100+
if (i == n || j == n || start.charAt(i) != end.charAt(j)) {
101+
return false;
102+
}
103+
if (start.charAt(i) == 'L' && i < j || start.charAt(i) == 'R' && i > j) {
104+
return false;
105+
}
106+
++i;
107+
++j;
108+
}
109+
}
110+
}
111+
```
112+
113+
### **C++**
114+
115+
```cpp
116+
class Solution {
117+
public:
118+
bool canTransform(string start, string end) {
119+
int n = start.size();
120+
int i = 0, j = 0;
121+
while (true) {
122+
while (i < n && start[i] == 'X') ++i;
123+
while (j < n && end[j] == 'X') ++j;
124+
if (i == n && j == n) return true;
125+
if (i == n || j == n || start[i] != end[j]) return false;
126+
if (start[i] == 'L' && i < j) return false;
127+
if (start[i] == 'R' && i > j) return false;
128+
++i;
129+
++j;
130+
}
131+
}
132+
};
133+
```
54134
135+
### **Go**
136+
137+
```go
138+
func canTransform(start string, end string) bool {
139+
n := len(start)
140+
i, j := 0, 0
141+
for {
142+
for i < n && start[i] == 'X' {
143+
i++
144+
}
145+
for j < n && end[j] == 'X' {
146+
j++
147+
}
148+
if i == n && j == n {
149+
return true
150+
}
151+
if i == n || j == n || start[i] != end[j] {
152+
return false
153+
}
154+
if start[i] == 'L' && i < j {
155+
return false
156+
}
157+
if start[i] == 'R' && i > j {
158+
return false
159+
}
160+
i, j = i+1, j+1
161+
}
162+
}
55163
```
56164

57165
### **...**

solution/0700-0799/0777.Swap Adjacent in LR String/README_EN.md

+94-1
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,106 @@ XRLXXRRLX
4343
### **Python3**
4444

4545
```python
46-
46+
class Solution:
47+
def canTransform(self, start: str, end: str) -> bool:
48+
n = len(start)
49+
i = j = 0
50+
while 1:
51+
while i < n and start[i] == 'X':
52+
i += 1
53+
while j < n and end[j] == 'X':
54+
j += 1
55+
if i >= n and j >= n:
56+
return True
57+
if i >= n or j >= n or start[i] != end[j]:
58+
return False
59+
if start[i] == 'L' and i < j:
60+
return False
61+
if start[i] == 'R' and i > j:
62+
return False
63+
i, j = i + 1, j + 1
4764
```
4865

4966
### **Java**
5067

5168
```java
69+
class Solution {
70+
public boolean canTransform(String start, String end) {
71+
int n = start.length();
72+
int i = 0, j = 0;
73+
while (true) {
74+
while (i < n && start.charAt(i) == 'X') {
75+
++i;
76+
}
77+
while (j < n && end.charAt(j) == 'X') {
78+
++j;
79+
}
80+
if (i == n && j == n) {
81+
return true;
82+
}
83+
if (i == n || j == n || start.charAt(i) != end.charAt(j)) {
84+
return false;
85+
}
86+
if (start.charAt(i) == 'L' && i < j || start.charAt(i) == 'R' && i > j) {
87+
return false;
88+
}
89+
++i;
90+
++j;
91+
}
92+
}
93+
}
94+
```
95+
96+
### **C++**
97+
98+
```cpp
99+
class Solution {
100+
public:
101+
bool canTransform(string start, string end) {
102+
int n = start.size();
103+
int i = 0, j = 0;
104+
while (true) {
105+
while (i < n && start[i] == 'X') ++i;
106+
while (j < n && end[j] == 'X') ++j;
107+
if (i == n && j == n) return true;
108+
if (i == n || j == n || start[i] != end[j]) return false;
109+
if (start[i] == 'L' && i < j) return false;
110+
if (start[i] == 'R' && i > j) return false;
111+
++i;
112+
++j;
113+
}
114+
}
115+
};
116+
```
52117
118+
### **Go**
119+
120+
```go
121+
func canTransform(start string, end string) bool {
122+
n := len(start)
123+
i, j := 0, 0
124+
for {
125+
for i < n && start[i] == 'X' {
126+
i++
127+
}
128+
for j < n && end[j] == 'X' {
129+
j++
130+
}
131+
if i == n && j == n {
132+
return true
133+
}
134+
if i == n || j == n || start[i] != end[j] {
135+
return false
136+
}
137+
if start[i] == 'L' && i < j {
138+
return false
139+
}
140+
if start[i] == 'R' && i > j {
141+
return false
142+
}
143+
i, j = i+1, j+1
144+
}
145+
}
53146
```
54147

55148
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public:
3+
bool canTransform(string start, string end) {
4+
int n = start.size();
5+
int i = 0, j = 0;
6+
while (true) {
7+
while (i < n && start[i] == 'X') ++i;
8+
while (j < n && end[j] == 'X') ++j;
9+
if (i == n && j == n) return true;
10+
if (i == n || j == n || start[i] != end[j]) return false;
11+
if (start[i] == 'L' && i < j) return false;
12+
if (start[i] == 'R' && i > j) return false;
13+
++i;
14+
++j;
15+
}
16+
}
17+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
func canTransform(start string, end string) bool {
2+
n := len(start)
3+
i, j := 0, 0
4+
for {
5+
for i < n && start[i] == 'X' {
6+
i++
7+
}
8+
for j < n && end[j] == 'X' {
9+
j++
10+
}
11+
if i == n && j == n {
12+
return true
13+
}
14+
if i == n || j == n || start[i] != end[j] {
15+
return false
16+
}
17+
if start[i] == 'L' && i < j {
18+
return false
19+
}
20+
if start[i] == 'R' && i > j {
21+
return false
22+
}
23+
i, j = i+1, j+1
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,18 @@
11
class Solution {
22
public boolean canTransform(String start, String end) {
3-
if (start.length() != end.length()) {
4-
return false;
5-
}
3+
int n = start.length();
64
int i = 0, j = 0;
75
while (true) {
8-
while (i < start.length() && start.charAt(i) == 'X') {
6+
while (i < n && start.charAt(i) == 'X') {
97
++i;
108
}
11-
while (j < end.length() && end.charAt(j) == 'X') {
9+
while (j < n && end.charAt(j) == 'X') {
1210
++j;
1311
}
14-
if (i == start.length() && j == start.length()) {
12+
if (i == n && j == n) {
1513
return true;
1614
}
17-
if (i == start.length() || j == start.length() || start.charAt(i) != end.charAt(j)) {
15+
if (i == n || j == n || start.charAt(i) != end.charAt(j)) {
1816
return false;
1917
}
2018
if (start.charAt(i) == 'L' && i < j || start.charAt(i) == 'R' && i > j) {
@@ -24,4 +22,4 @@ public boolean canTransform(String start, String end) {
2422
++j;
2523
}
2624
}
27-
}
25+
}

0 commit comments

Comments
 (0)