Skip to content

Commit d7fddea

Browse files
authored
feat: add solutions to lc problem: No.3606 (#4558)
No.3606.Coupon Validator
1 parent 55d4ea1 commit d7fddea

File tree

7 files changed

+536
-8
lines changed

7 files changed

+536
-8
lines changed

solution/3600-3699/3606.Coupon Code Validator/README.md

Lines changed: 184 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,32 +90,212 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3600-3699/3606.Co
9090

9191
<!-- solution:start -->
9292

93-
### 方法一
93+
### 方法一:模拟
94+
95+
我们可以直接模拟题目中的条件来筛选出有效的优惠券。具体步骤如下:
96+
97+
1. **检查标识符**:对于每个优惠券的标识符,检查它是否非空,并且只包含字母、数字和下划线。
98+
2. **检查业务类别**:检查每个优惠券的业务类别是否属于给定的四个有效类别之一。
99+
3. **检查激活状态**:检查每个优惠券是否处于激活状态。
100+
4. **收集有效优惠券**:将所有满足上述条件的优惠券的 id 收集起来。
101+
5. **排序**:根据业务类别和标识符对有效优惠券进行排序。
102+
6. **返回结果**:返回排序后的有效优惠券的标识符列表。
103+
104+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(n)$,其中 $n$ 是优惠券的数量。
94105

95106
<!-- tabs:start -->
96107

97108
#### Python3
98109

99110
```python
100-
111+
class Solution:
112+
def validateCoupons(
113+
self, code: List[str], businessLine: List[str], isActive: List[bool]
114+
) -> List[str]:
115+
def check(s: str) -> bool:
116+
if not s:
117+
return False
118+
for c in s:
119+
if not (c.isalpha() or c.isdigit() or c == "_"):
120+
return False
121+
return True
122+
123+
idx = []
124+
bs = {"electronics", "grocery", "pharmacy", "restaurant"}
125+
for i, (c, b, a) in enumerate(zip(code, businessLine, isActive)):
126+
if a and b in bs and check(c):
127+
idx.append(i)
128+
idx.sort(key=lambda i: (businessLine[i], code[i]))
129+
return [code[i] for i in idx]
101130
```
102131

103132
#### Java
104133

105134
```java
106-
135+
class Solution {
136+
public List<String> validateCoupons(String[] code, String[] businessLine, boolean[] isActive) {
137+
List<Integer> idx = new ArrayList<>();
138+
Set<String> bs
139+
= new HashSet<>(Arrays.asList("electronics", "grocery", "pharmacy", "restaurant"));
140+
141+
for (int i = 0; i < code.length; i++) {
142+
if (isActive[i] && bs.contains(businessLine[i]) && check(code[i])) {
143+
idx.add(i);
144+
}
145+
}
146+
147+
idx.sort((i, j) -> {
148+
int cmp = businessLine[i].compareTo(businessLine[j]);
149+
if (cmp != 0) {
150+
return cmp;
151+
}
152+
return code[i].compareTo(code[j]);
153+
});
154+
155+
List<String> ans = new ArrayList<>();
156+
for (int i : idx) {
157+
ans.add(code[i]);
158+
}
159+
return ans;
160+
}
161+
162+
private boolean check(String s) {
163+
if (s.isEmpty()) {
164+
return false;
165+
}
166+
for (char c : s.toCharArray()) {
167+
if (!Character.isLetterOrDigit(c) && c != '_') {
168+
return false;
169+
}
170+
}
171+
return true;
172+
}
173+
}
107174
```
108175

109176
#### C++
110177

111178
```cpp
112-
179+
class Solution {
180+
public:
181+
vector<string> validateCoupons(vector<string>& code, vector<string>& businessLine, vector<bool>& isActive) {
182+
vector<int> idx;
183+
unordered_set<string> bs = {"electronics", "grocery", "pharmacy", "restaurant"};
184+
185+
for (int i = 0; i < code.size(); ++i) {
186+
const string& c = code[i];
187+
const string& b = businessLine[i];
188+
bool a = isActive[i];
189+
if (a && bs.count(b) && check(c)) {
190+
idx.push_back(i);
191+
}
192+
}
193+
194+
sort(idx.begin(), idx.end(), [&](int i, int j) {
195+
if (businessLine[i] != businessLine[j]) return businessLine[i] < businessLine[j];
196+
return code[i] < code[j];
197+
});
198+
199+
vector<string> ans;
200+
for (int i : idx) {
201+
ans.push_back(code[i]);
202+
}
203+
return ans;
204+
}
205+
206+
private:
207+
bool check(const string& s) {
208+
if (s.empty()) return false;
209+
for (char c : s) {
210+
if (!isalnum(c) && c != '_') {
211+
return false;
212+
}
213+
}
214+
return true;
215+
}
216+
};
113217
```
114218
115219
#### Go
116220
117221
```go
222+
func validateCoupons(code []string, businessLine []string, isActive []bool) []string {
223+
idx := []int{}
224+
bs := map[string]struct{}{
225+
"electronics": {},
226+
"grocery": {},
227+
"pharmacy": {},
228+
"restaurant": {},
229+
}
230+
231+
check := func(s string) bool {
232+
if len(s) == 0 {
233+
return false
234+
}
235+
for _, c := range s {
236+
if !unicode.IsLetter(c) && !unicode.IsDigit(c) && c != '_' {
237+
return false
238+
}
239+
}
240+
return true
241+
}
242+
243+
for i := range code {
244+
if isActive[i] {
245+
if _, ok := bs[businessLine[i]]; ok && check(code[i]) {
246+
idx = append(idx, i)
247+
}
248+
}
249+
}
250+
251+
sort.Slice(idx, func(i, j int) bool {
252+
if businessLine[idx[i]] != businessLine[idx[j]] {
253+
return businessLine[idx[i]] < businessLine[idx[j]]
254+
}
255+
return code[idx[i]] < code[idx[j]]
256+
})
257+
258+
ans := make([]string, 0, len(idx))
259+
for _, i := range idx {
260+
ans = append(ans, code[i])
261+
}
262+
return ans
263+
}
264+
```
118265

266+
#### TypeScript
267+
268+
```ts
269+
function validateCoupons(code: string[], businessLine: string[], isActive: boolean[]): string[] {
270+
const idx: number[] = [];
271+
const bs = new Set(['electronics', 'grocery', 'pharmacy', 'restaurant']);
272+
273+
const check = (s: string): boolean => {
274+
if (s.length === 0) return false;
275+
for (let i = 0; i < s.length; i++) {
276+
const c = s[i];
277+
if (!/[a-zA-Z0-9_]/.test(c)) {
278+
return false;
279+
}
280+
}
281+
return true;
282+
};
283+
284+
for (let i = 0; i < code.length; i++) {
285+
if (isActive[i] && bs.has(businessLine[i]) && check(code[i])) {
286+
idx.push(i);
287+
}
288+
}
289+
290+
idx.sort((i, j) => {
291+
if (businessLine[i] !== businessLine[j]) {
292+
return businessLine[i] < businessLine[j] ? -1 : 1;
293+
}
294+
return code[i] < code[j] ? -1 : 1;
295+
});
296+
297+
return idx.map(i => code[i]);
298+
}
119299
```
120300

121301
<!-- tabs:end -->

0 commit comments

Comments
 (0)