Skip to content

Commit cc97f12

Browse files
committed
feat: add solutions to lc problem: No.1181
No.1181.Before and After Puzzle
1 parent 2c6a24e commit cc97f12

File tree

20 files changed

+324
-136
lines changed

20 files changed

+324
-136
lines changed

solution/0300-0399/0336.Palindrome Pairs/README.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@
3232
<strong>输出:</strong>[[0,1],[1,0]]
3333
</pre>
3434

35-
36-
3735
<p><strong>提示:</strong></p>
3836

3937
<ul>

solution/1000-1099/1095.Find in Mountain Array/Solution.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
# def get(self, index: int) -> int:
77
# def length(self) -> int:
88

9+
910
class Solution:
1011
def findInMountainArray(self, target: int, mountain_arr: 'MountainArray') -> int:
1112
def search(l: int, r: int, k: int) -> int:

solution/1100-1199/1166.Design File System/README_EN.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,11 +157,11 @@ class FileSystem {
157157
public FileSystem() {
158158

159159
}
160-
160+
161161
public boolean createPath(String path, int value) {
162162
return trie.insert(path, value);
163163
}
164-
164+
165165
public int get(String path) {
166166
return trie.search(path);
167167
}
@@ -235,11 +235,11 @@ public:
235235
FileSystem() {
236236
trie = new Trie(-1);
237237
}
238-
238+
239239
bool createPath(string path, int value) {
240240
return trie->insert(path, value);
241241
}
242-
242+
243243
int get(string path) {
244244
return trie->search(path);
245245
}

solution/1100-1199/1181.Before and After Puzzle/README.md

Lines changed: 114 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,15 @@
6363

6464
<!-- 这里可写通用的实现逻辑 -->
6565

66-
“哈希表 + 排序”实现。
66+
**方法一:哈希表 + 排序**
67+
68+
我们先遍历列表 `phrases`,将每个短语的首尾单词存储数组 $ps$ 中,其中 $ps[i][0]$ 和 $ps[i][1]$ 分别表示第 $i$ 个短语的首尾单词。
69+
70+
接下来,我们枚举所有 $(i, j)$,其中 $i, j \in [0, n)$ 且 $i \neq j$。如果 $ps[i][1] = ps[j][0]$,那么我们就可以将第 $i$ 个短语和第 $j$ 个短语进行拼接,得到的新短语为 $phrases[i] + phrases[j][len(ps[j][0]):]$,将新短语加入哈希表 $s$ 中。
71+
72+
最后,我们将哈希表 $s$ 转化为数组并排序,即可得到答案。
73+
74+
时间复杂度 $O(n^2 \times m \times (\log n + \log m))$,空间复杂度 $O(n^2 \times m)$。其中 $n$ 和 $m$ 分别表示数组 $phrases$ 的长度和每个短语的平均长度。
6775

6876
<!-- tabs:start -->
6977

@@ -74,18 +82,17 @@
7482
```python
7583
class Solution:
7684
def beforeAndAfterPuzzles(self, phrases: List[str]) -> List[str]:
77-
same_first_word = defaultdict(set)
78-
for i, phrase in enumerate(phrases):
79-
same_first_word[phrase.split()[0]].add(i)
80-
res = set()
81-
for i, phrase in enumerate(phrases):
82-
words = phrase.split()
83-
last_word = words[-1]
84-
if last_word in same_first_word:
85-
for j in same_first_word[last_word]:
86-
if i != j:
87-
res.add(' '.join(words[:-1] + phrases[j].split()))
88-
return sorted(list(res))
85+
ps = []
86+
for p in phrases:
87+
ws = p.split()
88+
ps.append((ws[0], ws[-1]))
89+
n = len(ps)
90+
ans = []
91+
for i in range(n):
92+
for j in range(n):
93+
if i != j and ps[i][1] == ps[j][0]:
94+
ans.append(phrases[i] + phrases[j][len(ps[j][0]):])
95+
return sorted(set(ans))
8996
```
9097

9198
### **Java**
@@ -95,36 +102,105 @@ class Solution:
95102
```java
96103
class Solution {
97104
public List<String> beforeAndAfterPuzzles(String[] phrases) {
98-
Map<String, Set<Integer>> sameFirstWord = new HashMap<>();
99-
for (int i = 0; i < phrases.length; ++i) {
100-
String phrase = phrases[i];
101-
String word = phrase.split(" ")[0];
102-
sameFirstWord.computeIfAbsent(word, k -> new HashSet<>()).add(i);
105+
int n = phrases.length;
106+
var ps = new String[n][];
107+
for (int i = 0; i < n; ++i) {
108+
var ws = phrases[i].split(" ");
109+
ps[i] = new String[]{ws[0], ws[ws.length - 1]};
103110
}
104-
Set<String> res = new HashSet<>();
105-
for (int i = 0; i < phrases.length; ++i) {
106-
String phrase = phrases[i];
107-
String[] words = phrase.split(" ");
108-
String lastWord = words[words.length - 1];
109-
if (sameFirstWord.containsKey(lastWord)) {
110-
for (int j : sameFirstWord.get(lastWord)) {
111-
if (i != j) {
112-
List<String> t = new ArrayList<>();
113-
for (int k = 0; k < words.length - 1; ++k) {
114-
t.add(words[k]);
115-
}
116-
for (String word : phrases[j].split(" ")) {
117-
t.add(word);
118-
}
119-
res.add(String.join(" ", t));
120-
}
111+
Set<String> s = new HashSet<>();
112+
for (int i = 0; i < n; ++i) {
113+
for (int j = 0; j < n; ++j) {
114+
if (i != j && ps[i][1].equals(ps[j][0])) {
115+
s.add(phrases[i] + phrases[j].substring(ps[j][0].length()));
121116
}
122117
}
123118
}
124-
List<String> output = new ArrayList<>(res);
125-
Collections.sort(output);
126-
return output;
119+
var ans = new ArrayList<>(s);
120+
Collections.sort(ans);
121+
return ans;
122+
}
123+
}
124+
```
125+
126+
### **C++**
127+
128+
```cpp
129+
class Solution {
130+
public:
131+
vector<string> beforeAndAfterPuzzles(vector<string>& phrases) {
132+
int n = phrases.size();
133+
pair<string, string> ps[n];
134+
for (int i = 0; i < n; ++i) {
135+
int j = phrases[i].find(' ');
136+
if (j == string::npos) {
137+
ps[i] = {phrases[i], phrases[i]};
138+
} else {
139+
int k = phrases[i].rfind(' ');
140+
ps[i] = {phrases[i].substr(0, j), phrases[i].substr(k + 1)};
141+
}
142+
}
143+
unordered_set<string> s;
144+
for (int i = 0; i < n; ++i) {
145+
for (int j = 0; j < n; ++j) {
146+
if (i != j && ps[i].second == ps[j].first) {
147+
s.insert(phrases[i] + phrases[j].substr(ps[i].second.size()));
148+
}
149+
}
150+
}
151+
vector<string> ans(s.begin(), s.end());
152+
sort(ans.begin(), ans.end());
153+
return ans;
154+
}
155+
};
156+
```
157+
158+
### **Go**
159+
160+
```go
161+
func beforeAndAfterPuzzles(phrases []string) []string {
162+
n := len(phrases)
163+
ps := make([][2]string, n)
164+
for i, p := range phrases {
165+
ws := strings.Split(p, " ")
166+
ps[i] = [2]string{ws[0], ws[len(ws)-1]}
167+
}
168+
s := map[string]bool{}
169+
for i := 0; i < n; i++ {
170+
for j := 0; j < n; j++ {
171+
if i != j && ps[i][1] == ps[j][0] {
172+
s[phrases[i]+phrases[j][len(ps[j][0]):]] = true
173+
}
174+
}
175+
}
176+
ans := make([]string, 0, len(s))
177+
for k := range s {
178+
ans = append(ans, k)
179+
}
180+
sort.Strings(ans)
181+
return ans
182+
}
183+
```
184+
185+
### **TypeScript**
186+
187+
```ts
188+
function beforeAndAfterPuzzles(phrases: string[]): string[] {
189+
const ps: string[][] = [];
190+
for (const p of phrases) {
191+
const ws = p.split(' ');
192+
ps.push([ws[0], ws[ws.length - 1]]);
193+
}
194+
const n = ps.length;
195+
const s: Set<string> = new Set();
196+
for (let i = 0; i < n; ++i) {
197+
for (let j = 0; j < n; ++j) {
198+
if (i !== j && ps[i][1] === ps[j][0]) {
199+
s.add(`${phrases[i]}${phrases[j].substring(ps[j][0].length)}`);
200+
}
201+
}
127202
}
203+
return [...s].sort();
128204
}
129205
```
130206

solution/1100-1199/1181.Before and After Puzzle/README_EN.md

Lines changed: 105 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -65,58 +65,126 @@
6565
```python
6666
class Solution:
6767
def beforeAndAfterPuzzles(self, phrases: List[str]) -> List[str]:
68-
same_first_word = defaultdict(set)
69-
for i, phrase in enumerate(phrases):
70-
same_first_word[phrase.split()[0]].add(i)
71-
res = set()
72-
for i, phrase in enumerate(phrases):
73-
words = phrase.split()
74-
last_word = words[-1]
75-
if last_word in same_first_word:
76-
for j in same_first_word[last_word]:
77-
if i != j:
78-
res.add(' '.join(words[:-1] + phrases[j].split()))
79-
return sorted(list(res))
68+
ps = []
69+
for p in phrases:
70+
ws = p.split()
71+
ps.append((ws[0], ws[-1]))
72+
n = len(ps)
73+
ans = []
74+
for i in range(n):
75+
for j in range(n):
76+
if i != j and ps[i][1] == ps[j][0]:
77+
ans.append(phrases[i] + phrases[j][len(ps[j][0]):])
78+
return sorted(set(ans))
8079
```
8180

8281
### **Java**
8382

8483
```java
8584
class Solution {
8685
public List<String> beforeAndAfterPuzzles(String[] phrases) {
87-
Map<String, Set<Integer>> sameFirstWord = new HashMap<>();
88-
for (int i = 0; i < phrases.length; ++i) {
89-
String phrase = phrases[i];
90-
String word = phrase.split(" ")[0];
91-
sameFirstWord.computeIfAbsent(word, k -> new HashSet<>()).add(i);
86+
int n = phrases.length;
87+
var ps = new String[n][];
88+
for (int i = 0; i < n; ++i) {
89+
var ws = phrases[i].split(" ");
90+
ps[i] = new String[]{ws[0], ws[ws.length - 1]};
9291
}
93-
Set<String> res = new HashSet<>();
94-
for (int i = 0; i < phrases.length; ++i) {
95-
String phrase = phrases[i];
96-
String[] words = phrase.split(" ");
97-
String lastWord = words[words.length - 1];
98-
if (sameFirstWord.containsKey(lastWord)) {
99-
for (int j : sameFirstWord.get(lastWord)) {
100-
if (i != j) {
101-
List<String> t = new ArrayList<>();
102-
for (int k = 0; k < words.length - 1; ++k) {
103-
t.add(words[k]);
104-
}
105-
for (String word : phrases[j].split(" ")) {
106-
t.add(word);
107-
}
108-
res.add(String.join(" ", t));
109-
}
92+
Set<String> s = new HashSet<>();
93+
for (int i = 0; i < n; ++i) {
94+
for (int j = 0; j < n; ++j) {
95+
if (i != j && ps[i][1].equals(ps[j][0])) {
96+
s.add(phrases[i] + phrases[j].substring(ps[j][0].length()));
11097
}
11198
}
11299
}
113-
List<String> output = new ArrayList<>(res);
114-
Collections.sort(output);
115-
return output;
100+
var ans = new ArrayList<>(s);
101+
Collections.sort(ans);
102+
return ans;
116103
}
117104
}
118105
```
119106

107+
### **C++**
108+
109+
```cpp
110+
class Solution {
111+
public:
112+
vector<string> beforeAndAfterPuzzles(vector<string>& phrases) {
113+
int n = phrases.size();
114+
pair<string, string> ps[n];
115+
for (int i = 0; i < n; ++i) {
116+
int j = phrases[i].find(' ');
117+
if (j == string::npos) {
118+
ps[i] = {phrases[i], phrases[i]};
119+
} else {
120+
int k = phrases[i].rfind(' ');
121+
ps[i] = {phrases[i].substr(0, j), phrases[i].substr(k + 1)};
122+
}
123+
}
124+
unordered_set<string> s;
125+
for (int i = 0; i < n; ++i) {
126+
for (int j = 0; j < n; ++j) {
127+
if (i != j && ps[i].second == ps[j].first) {
128+
s.insert(phrases[i] + phrases[j].substr(ps[i].second.size()));
129+
}
130+
}
131+
}
132+
vector<string> ans(s.begin(), s.end());
133+
sort(ans.begin(), ans.end());
134+
return ans;
135+
}
136+
};
137+
```
138+
139+
### **Go**
140+
141+
```go
142+
func beforeAndAfterPuzzles(phrases []string) []string {
143+
n := len(phrases)
144+
ps := make([][2]string, n)
145+
for i, p := range phrases {
146+
ws := strings.Split(p, " ")
147+
ps[i] = [2]string{ws[0], ws[len(ws)-1]}
148+
}
149+
s := map[string]bool{}
150+
for i := 0; i < n; i++ {
151+
for j := 0; j < n; j++ {
152+
if i != j && ps[i][1] == ps[j][0] {
153+
s[phrases[i]+phrases[j][len(ps[j][0]):]] = true
154+
}
155+
}
156+
}
157+
ans := make([]string, 0, len(s))
158+
for k := range s {
159+
ans = append(ans, k)
160+
}
161+
sort.Strings(ans)
162+
return ans
163+
}
164+
```
165+
166+
### **TypeScript**
167+
168+
```ts
169+
function beforeAndAfterPuzzles(phrases: string[]): string[] {
170+
const ps: string[][] = [];
171+
for (const p of phrases) {
172+
const ws = p.split(' ');
173+
ps.push([ws[0], ws[ws.length - 1]]);
174+
}
175+
const n = ps.length;
176+
const s: Set<string> = new Set();
177+
for (let i = 0; i < n; ++i) {
178+
for (let j = 0; j < n; ++j) {
179+
if (i !== j && ps[i][1] === ps[j][0]) {
180+
s.add(`${phrases[i]}${phrases[j].substring(ps[j][0].length)}`);
181+
}
182+
}
183+
}
184+
return [...s].sort();
185+
}
186+
```
187+
120188
### **...**
121189

122190
```

0 commit comments

Comments
 (0)