Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 9feb0a8

Browse files
feat: add solutions to lc problem: No.0320 (#1974)
No.0320.Generalized Abbreviation
1 parent 40999a2 commit 9feb0a8

File tree

7 files changed

+576
-121
lines changed

7 files changed

+576
-121
lines changed

‎solution/0300-0399/0320.Generalized Abbreviation/README.md‎

Lines changed: 234 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,30 @@
5454

5555
## 解法
5656

57-
回溯法。
58-
5957
<!-- 这里可写通用的实现逻辑 -->
6058

59+
**方法一:DFS**
60+
61+
我们设计一个函数 $dfs(i),ドル表示对于字符串 $word[i:],ドル返回其所有可能的缩写。
62+
63+
函数 $dfs(i)$ 的执行逻辑如下:
64+
65+
如果 $i \geq n,ドル说明已经处理完了字符串 $word,ドル直接返回一个空字符串组成的列表。
66+
67+
否则,我们可以选择保留 $word[i],ドル然后对 $dfs(i + 1)$ 返回的列表中的每个字符串前面添加 $word[i],ドル将得到的结果添加到答案中。
68+
69+
我们也可以选择删除 $word[i]$ 及其后面的若干个字符,假设我们删除了 $word[i..j),ドル那么第 $j$ 个字符不删除,然后对 $dfs(j + 1)$ 返回的列表中的每个字符串前面添加 $j - i,ドル将得到的结果添加到答案中。
70+
71+
最后,我们在主函数中调用 $dfs(0)$ 即可。
72+
73+
时间复杂度 $O(n \times 2^n),ドル空间复杂度 $O(n)$。其中 $n$ 是字符串 $word$ 的长度。
74+
75+
**方法二:二进制枚举**
76+
77+
由于字符串 $word$ 的长度不超过 15ドル,ドル因此我们可以使用二进制枚举的方法枚举所有的缩写。我们用一个长度为 $n$ 的二进制数 $i$ 表示一种缩写方式,其中 0ドル$ 表示保留对应的字符,而 1ドル$ 表示删除对应的字符。我们在 $[0, 2^n)$ 的范围内枚举所有 $i,ドル并将其转换成对应的缩写,添加到答案列表中即可。
78+
79+
时间复杂度 $O(n \times 2^n),ドル空间复杂度 $O(n)$。其中 $n$ 是字符串 $word$ 的长度。
80+
6181
<!-- tabs:start -->
6282

6383
### **Python3**
@@ -67,26 +87,38 @@
6787
```python
6888
class Solution:
6989
def generateAbbreviations(self, word: str) -> List[str]:
70-
def dfs(s, t):
71-
if not s:
72-
ans.append(''.join(t))
73-
return
74-
for i in range(1, len(s) + 1):
75-
t.append(str(i))
76-
if i < len(s):
77-
t.append(s[i])
78-
dfs(s[i + 1 :], t)
79-
t.pop()
80-
else:
81-
dfs(s[i:], t)
82-
t.pop()
83-
84-
t.append(s[0])
85-
dfs(s[1:], t)
86-
t.pop()
90+
def dfs(i: int) -> List[str]:
91+
if i >= n:
92+
return [""]
93+
ans = [word[i] + s for s in dfs(i + 1)]
94+
for j in range(i + 1, n + 1):
95+
for s in dfs(j + 1):
96+
ans.append(str(j - i) + (word[j] if j < n else "") + s)
97+
return ans
98+
99+
n = len(word)
100+
return dfs(0)
101+
```
87102

103+
```python
104+
class Solution:
105+
def generateAbbreviations(self, word: str) -> List[str]:
106+
n = len(word)
88107
ans = []
89-
dfs(word, [])
108+
for i in range(1 << n):
109+
cnt = 0
110+
s = []
111+
for j in range(n):
112+
if i >> j & 1:
113+
cnt += 1
114+
else:
115+
if cnt:
116+
s.append(str(cnt))
117+
cnt = 0
118+
s.append(word[j])
119+
if cnt:
120+
s.append(str(cnt))
121+
ans.append("".join(s))
90122
return ans
91123
```
92124

@@ -96,35 +128,197 @@ class Solution:
96128

97129
```java
98130
class Solution {
99-
private List<String> ans;
131+
private String word;
132+
private int n;
100133

101134
public List<String> generateAbbreviations(String word) {
102-
ans = new ArrayList<>();
103-
List<String> t = new ArrayList<>();
104-
dfs(word, t);
135+
this.word = word;
136+
n = word.length();
137+
return dfs(0);
138+
}
139+
140+
private List<String> dfs(int i) {
141+
if (i >= n) {
142+
return List.of("");
143+
}
144+
List<String> ans = new ArrayList<>();
145+
for (String s : dfs(i + 1)) {
146+
ans.add(String.valueOf(word.charAt(i)) + s);
147+
}
148+
for (int j = i + 1; j <= n; ++j) {
149+
for (String s : dfs(j + 1)) {
150+
ans.add((j - i) + "" + (j < n ? String.valueOf(word.charAt(j)) : "") + s);
151+
}
152+
}
105153
return ans;
106154
}
155+
}
156+
```
107157

108-
private void dfs(String s, List<String> t) {
109-
if ("".equals(s)) {
110-
ans.add(String.join("", t));
111-
return;
158+
```java
159+
class Solution {
160+
public List<String> generateAbbreviations(String word) {
161+
int n = word.length();
162+
List<String> ans = new ArrayList<>();
163+
for (int i = 0; i < 1 << n; ++i) {
164+
StringBuilder s = new StringBuilder();
165+
int cnt = 0;
166+
for (int j = 0; j < n; ++j) {
167+
if ((i >> j & 1) == 1) {
168+
++cnt;
169+
} else {
170+
if (cnt > 0) {
171+
s.append(cnt);
172+
cnt = 0;
173+
}
174+
s.append(word.charAt(j));
175+
}
176+
}
177+
if (cnt > 0) {
178+
s.append(cnt);
179+
}
180+
ans.add(s.toString());
112181
}
113-
for (int i = 1; i < s.length() + 1; ++i) {
114-
t.add(i + "");
115-
if (i < s.length()) {
116-
t.add(String.valueOf(s.charAt(i)));
117-
dfs(s.substring(i + 1), t);
118-
t.remove(t.size() - 1);
119-
} else {
120-
dfs(s.substring(i), t);
182+
return ans;
183+
}
184+
}
185+
```
186+
187+
### **C++**
188+
189+
```cpp
190+
class Solution {
191+
public:
192+
vector<string> generateAbbreviations(string word) {
193+
int n = word.size();
194+
function<vector<string>(int)> dfs = [&](int i) -> vector<string> {
195+
if (i >= n) {
196+
return {""};
197+
}
198+
vector<string> ans;
199+
for (auto& s : dfs(i + 1)) {
200+
string p(1, word[i]);
201+
ans.emplace_back(p + s);
202+
}
203+
for (int j = i + 1; j <= n; ++j) {
204+
for (auto& s : dfs(j + 1)) {
205+
string p = j < n ? string(1, word[j]) : "";
206+
ans.emplace_back(to_string(j - i) + p + s);
207+
}
208+
}
209+
return ans;
210+
};
211+
return dfs(0);
212+
}
213+
};
214+
```
215+
216+
```cpp
217+
class Solution {
218+
public:
219+
vector<string> generateAbbreviations(string word) {
220+
int n = word.size();
221+
vector<string> ans;
222+
for (int i = 0; i < 1 << n; ++i) {
223+
string s;
224+
int cnt = 0;
225+
for (int j = 0; j < n; ++j) {
226+
if (i >> j & 1) {
227+
++cnt;
228+
} else {
229+
if (cnt) {
230+
s += to_string(cnt);
231+
cnt = 0;
232+
}
233+
s.push_back(word[j]);
234+
}
235+
}
236+
if (cnt) {
237+
s += to_string(cnt);
121238
}
122-
t.remove(t.size() -1);
239+
ans.push_back(s);
123240
}
124-
t.add(String.valueOf(s.charAt(0)));
125-
dfs(s.substring(1), t);
126-
t.remove(t.size() - 1);
241+
return ans;
127242
}
243+
};
244+
```
245+
246+
### **Go**
247+
248+
```go
249+
func generateAbbreviations(word string) []string {
250+
n := len(word)
251+
var dfs func(int) []string
252+
dfs = func(i int) []string {
253+
if i >= n {
254+
return []string{""}
255+
}
256+
ans := []string{}
257+
for _, s := range dfs(i + 1) {
258+
ans = append(ans, word[i:i+1]+s)
259+
}
260+
for j := i + 1; j <= n; j++ {
261+
for _, s := range dfs(j + 1) {
262+
p := ""
263+
if j < n {
264+
p = word[j : j+1]
265+
}
266+
ans = append(ans, strconv.Itoa(j-i)+p+s)
267+
}
268+
}
269+
return ans
270+
}
271+
return dfs(0)
272+
}
273+
```
274+
275+
```go
276+
func generateAbbreviations(word string) (ans []string) {
277+
n := len(word)
278+
for i := 0; i < 1<<n; i++ {
279+
s := &strings.Builder{}
280+
cnt := 0
281+
for j := 0; j < n; j++ {
282+
if i>>j&1 == 1 {
283+
cnt++
284+
} else {
285+
if cnt > 0 {
286+
s.WriteString(strconv.Itoa(cnt))
287+
cnt = 0
288+
}
289+
s.WriteByte(word[j])
290+
}
291+
}
292+
if cnt > 0 {
293+
s.WriteString(strconv.Itoa(cnt))
294+
}
295+
ans = append(ans, s.String())
296+
}
297+
return
298+
}
299+
```
300+
301+
### **TypeScript**
302+
303+
```ts
304+
function generateAbbreviations(word: string): string[] {
305+
const n = word.length;
306+
const dfs = (i: number): string[] => {
307+
if (i >= n) {
308+
return [''];
309+
}
310+
const ans: string[] = [];
311+
for (const s of dfs(i + 1)) {
312+
ans.push(word[i] + s);
313+
}
314+
for (let j = i + 1; j <= n; ++j) {
315+
for (const s of dfs(j + 1)) {
316+
ans.push((j - i).toString() + (j < n ? word[j] : '') + s);
317+
}
318+
}
319+
return ans;
320+
};
321+
return dfs(0);
128322
}
129323
```
130324

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /