Skip to content

Commit e5bf058

Browse files
committed
feat: add solutions to lc problem: No.1096
No.1096.Brace Expansion II
1 parent 55f4859 commit e5bf058

File tree

6 files changed

+312
-2
lines changed

6 files changed

+312
-2
lines changed

solution/1000-1099/1096.Brace Expansion II/README.md

Lines changed: 113 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,22 +71,134 @@
7171

7272
<!-- 这里可写通用的实现逻辑 -->
7373

74+
**方法一:递归**
75+
76+
设计递归函数 `dfs(exp)`
77+
78+
- 如果 `exp` 不包含 `{}`,将 `exp` 中的字符加入结果集 `s` 中,返回;
79+
- 否则,找到第一个 `}` 的位置 $j$,从 $j$ 往前找到第一个 `{` 的位置 $i$,将 $exp[i+1..j-1]$ 之间的字符串按照 `,` 分割,得到一个字符串数组 `bs`。将 `exp[0..i-1]``exp[j+1..]` 作为前缀 $a$ 和后缀 $c$,分别与 `bs` 中的每个字符串 $b$ 拼接,然后递归调用 `dfs(a+b+c)`
80+
81+
最后对结果集排序,返回。
82+
7483
<!-- tabs:start -->
7584

7685
### **Python3**
7786

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

8089
```python
81-
90+
class Solution:
91+
def braceExpansionII(self, expression: str) -> List[str]:
92+
def dfs(exp):
93+
j = exp.find('}')
94+
if j == -1:
95+
s.add(exp)
96+
return
97+
i = j
98+
while exp[i] != '{':
99+
i -= 1
100+
a, c, = exp[:i], exp[j + 1:]
101+
for b in exp[i + 1: j].split(','):
102+
dfs(a + b + c)
103+
104+
s = set()
105+
dfs(expression)
106+
return sorted(s)
82107
```
83108

84109
### **Java**
85110

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

88113
```java
114+
class Solution {
115+
private TreeSet<String> s = new TreeSet<>();
116+
117+
public List<String> braceExpansionII(String expression) {
118+
dfs(expression);
119+
return new ArrayList<>(s);
120+
}
121+
122+
private void dfs(String exp) {
123+
int j = exp.indexOf('}');
124+
if (j == -1) {
125+
s.add(exp);
126+
return;
127+
}
128+
int i = j;
129+
while (exp.charAt(i) != '{') {
130+
--i;
131+
}
132+
String a = exp.substring(0, i);
133+
String c = exp.substring(j + 1);
134+
for (String b : exp.substring(i + 1, j).split(",")) {
135+
dfs(a + b + c);
136+
}
137+
}
138+
}
139+
```
140+
141+
### **C++**
142+
143+
```cpp
144+
class Solution {
145+
public:
146+
set<string> s;
147+
vector<string> braceExpansionII(string expression) {
148+
dfs(expression);
149+
return vector<string>(s.begin(), s.end());
150+
}
151+
152+
void dfs(string exp) {
153+
int j = exp.find('}');
154+
if (j == -1) {
155+
s.insert(exp);
156+
return;
157+
}
158+
int i = j;
159+
while (exp[i] != '{') {
160+
--i;
161+
}
162+
string a = exp.substr(0, i);
163+
string c = exp.substr(j + 1);
164+
stringstream ss(exp.substr(i + 1, j - i - 1));
165+
string b;
166+
while (getline(ss, b, ',')) {
167+
dfs(a + b + c);
168+
}
169+
}
170+
};
171+
```
89172

173+
### **Go**
174+
175+
```go
176+
func braceExpansionII(expression string) []string {
177+
s := map[string]struct{}{}
178+
var dfs func(exp string)
179+
dfs = func(exp string) {
180+
j := strings.IndexByte(exp, '}')
181+
if j == -1 {
182+
s[exp] = struct{}{}
183+
return
184+
}
185+
i := j
186+
for exp[i] != '{' {
187+
i--
188+
}
189+
a, c := exp[:i], exp[j+1:]
190+
for _, b := range strings.Split(exp[i+1:j], ",") {
191+
dfs(a + b + c)
192+
}
193+
}
194+
dfs(expression)
195+
ans := []string{}
196+
for v := range s {
197+
ans = append(ans, v)
198+
}
199+
sort.Strings(ans)
200+
return ans
201+
}
90202
```
91203

92204
### **...**

solution/1000-1099/1096.Brace Expansion II/README_EN.md

Lines changed: 104 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,116 @@
7171
### **Python3**
7272

7373
```python
74-
74+
class Solution:
75+
def braceExpansionII(self, expression: str) -> List[str]:
76+
def dfs(exp):
77+
j = exp.find('}')
78+
if j == -1:
79+
s.add(exp)
80+
return
81+
i = j
82+
while exp[i] != '{':
83+
i -= 1
84+
a, c, = exp[:i], exp[j + 1:]
85+
for b in exp[i + 1: j].split(','):
86+
dfs(a + b + c)
87+
88+
s = set()
89+
dfs(expression)
90+
return sorted(s)
7591
```
7692

7793
### **Java**
7894

7995
```java
96+
class Solution {
97+
private TreeSet<String> s = new TreeSet<>();
98+
99+
public List<String> braceExpansionII(String expression) {
100+
dfs(expression);
101+
return new ArrayList<>(s);
102+
}
103+
104+
private void dfs(String exp) {
105+
int j = exp.indexOf('}');
106+
if (j == -1) {
107+
s.add(exp);
108+
return;
109+
}
110+
int i = j;
111+
while (exp.charAt(i) != '{') {
112+
--i;
113+
}
114+
String a = exp.substring(0, i);
115+
String c = exp.substring(j + 1);
116+
for (String b : exp.substring(i + 1, j).split(",")) {
117+
dfs(a + b + c);
118+
}
119+
}
120+
}
121+
```
122+
123+
### **C++**
124+
125+
```cpp
126+
class Solution {
127+
public:
128+
set<string> s;
129+
vector<string> braceExpansionII(string expression) {
130+
dfs(expression);
131+
return vector<string>(s.begin(), s.end());
132+
}
133+
134+
void dfs(string exp) {
135+
int j = exp.find('}');
136+
if (j == -1) {
137+
s.insert(exp);
138+
return;
139+
}
140+
int i = j;
141+
while (exp[i] != '{') {
142+
--i;
143+
}
144+
string a = exp.substr(0, i);
145+
string c = exp.substr(j + 1);
146+
stringstream ss(exp.substr(i + 1, j - i - 1));
147+
string b;
148+
while (getline(ss, b, ',')) {
149+
dfs(a + b + c);
150+
}
151+
}
152+
};
153+
```
80154

155+
### **Go**
156+
157+
```go
158+
func braceExpansionII(expression string) []string {
159+
s := map[string]struct{}{}
160+
var dfs func(exp string)
161+
dfs = func(exp string) {
162+
j := strings.IndexByte(exp, '}')
163+
if j == -1 {
164+
s[exp] = struct{}{}
165+
return
166+
}
167+
i := j
168+
for exp[i] != '{' {
169+
i--
170+
}
171+
a, c := exp[:i], exp[j+1:]
172+
for _, b := range strings.Split(exp[i+1:j], ",") {
173+
dfs(a + b + c)
174+
}
175+
}
176+
dfs(expression)
177+
ans := []string{}
178+
for v := range s {
179+
ans = append(ans, v)
180+
}
181+
sort.Strings(ans)
182+
return ans
183+
}
81184
```
82185

83186
### **...**
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
public:
3+
set<string> s;
4+
vector<string> braceExpansionII(string expression) {
5+
dfs(expression);
6+
return vector<string>(s.begin(), s.end());
7+
}
8+
9+
void dfs(string exp) {
10+
int j = exp.find('}');
11+
if (j == -1) {
12+
s.insert(exp);
13+
return;
14+
}
15+
int i = j;
16+
while (exp[i] != '{') {
17+
--i;
18+
}
19+
string a = exp.substr(0, i);
20+
string c = exp.substr(j + 1);
21+
stringstream ss(exp.substr(i + 1, j - i - 1));
22+
string b;
23+
while (getline(ss, b, ',')) {
24+
dfs(a + b + c);
25+
}
26+
}
27+
};
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
func braceExpansionII(expression string) []string {
2+
s := map[string]struct{}{}
3+
var dfs func(exp string)
4+
dfs = func(exp string) {
5+
j := strings.IndexByte(exp, '}')
6+
if j == -1 {
7+
s[exp] = struct{}{}
8+
return
9+
}
10+
i := j
11+
for exp[i] != '{' {
12+
i--
13+
}
14+
a, c := exp[:i], exp[j+1:]
15+
for _, b := range strings.Split(exp[i+1:j], ",") {
16+
dfs(a + b + c)
17+
}
18+
}
19+
dfs(expression)
20+
ans := []string{}
21+
for v := range s {
22+
ans = append(ans, v)
23+
}
24+
sort.Strings(ans)
25+
return ans
26+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution {
2+
private TreeSet<String> s = new TreeSet<>();
3+
4+
public List<String> braceExpansionII(String expression) {
5+
dfs(expression);
6+
return new ArrayList<>(s);
7+
}
8+
9+
private void dfs(String exp) {
10+
int j = exp.indexOf('}');
11+
if (j == -1) {
12+
s.add(exp);
13+
return;
14+
}
15+
int i = j;
16+
while (exp.charAt(i) != '{') {
17+
--i;
18+
}
19+
String a = exp.substring(0, i);
20+
String c = exp.substring(j + 1);
21+
for (String b : exp.substring(i + 1, j).split(",")) {
22+
dfs(a + b + c);
23+
}
24+
}
25+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution:
2+
def braceExpansionII(self, expression: str) -> List[str]:
3+
def dfs(exp):
4+
j = exp.find('}')
5+
if j == -1:
6+
s.add(exp)
7+
return
8+
i = j
9+
while exp[i] != '{':
10+
i -= 1
11+
a, c, = exp[:i], exp[j + 1:]
12+
for b in exp[i + 1: j].split(','):
13+
dfs(a + b + c)
14+
15+
s = set()
16+
dfs(expression)
17+
return sorted(s)

0 commit comments

Comments
 (0)