Skip to content

Commit 8d90ab5

Browse files
committed
test: 966 solution
py, c++, go, java
1 parent 9f03252 commit 8d90ab5

File tree

8 files changed

+192
-23
lines changed

8 files changed

+192
-23
lines changed

data/ratings.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

problems/problems_966/Solution.cpp

Lines changed: 64 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,77 @@
11
//go:build ignore
22
#include "cpp/common/Solution.h"
3-
3+
#include <algorithm>
44

55
using namespace std;
66
using json = nlohmann::json;
77

8+
constexpr string VOWELS = "aeiou";
9+
810
class Solution {
911
public:
10-
vector<string> spellchecker(vector<string>& wordlist, vector<string>& queries) {
11-
12+
vector<string> spellchecker(const vector<string> &wordlist,
13+
const vector<string> &queries) {
14+
unordered_set<string> origin;
15+
unordered_map<string, string> ignore_cases, ignore_vowels;
16+
17+
auto strIgnoreVowels = [](string &w) -> void {
18+
for (auto &c : w) {
19+
if (VOWELS.find(c) != string::npos) {
20+
c = '*';
21+
}
22+
}
23+
};
24+
25+
for (const auto &word : wordlist) {
26+
origin.insert(word);
27+
string lower = word;
28+
std::transform(word.begin(), word.end(), lower.begin(), ::tolower);
29+
if (ignore_cases.find(lower) == ignore_cases.end()) {
30+
ignore_cases[lower] = word;
31+
}
32+
strIgnoreVowels(lower);
33+
if (ignore_vowels.find(lower) == ignore_vowels.end()) {
34+
ignore_vowels[lower] = word;
35+
}
1236
}
37+
38+
vector<string> ans;
39+
for (const auto &query : queries) {
40+
if (origin.contains(query)) {
41+
ans.emplace_back(query);
42+
continue;
43+
}
44+
string lower = query;
45+
std::transform(query.begin(), query.end(), lower.begin(), ::tolower);
46+
auto it = ignore_cases.find(lower);
47+
if (it != ignore_cases.end()) {
48+
ans.emplace_back(it->second);
49+
continue;
50+
}
51+
strIgnoreVowels(lower);
52+
it = ignore_vowels.find(lower);
53+
if (it != ignore_vowels.end()) {
54+
ans.emplace_back(it->second);
55+
continue;
56+
}
57+
ans.emplace_back("");
58+
}
59+
return ans;
60+
}
1361
};
1462

1563
json leetcode::qubh::Solve(string input_json_values) {
16-
vector<string> inputArray;
17-
size_t pos = input_json_values.find('\n');
18-
while (pos != string::npos) {
19-
inputArray.push_back(input_json_values.substr(0, pos));
20-
input_json_values = input_json_values.substr(pos + 1);
21-
pos = input_json_values.find('\n');
22-
}
23-
inputArray.push_back(input_json_values);
24-
25-
Solution solution;
26-
vector<string> wordlist = json::parse(inputArray.at(0));
27-
vector<string> queries = json::parse(inputArray.at(1));
28-
return solution.spellchecker(wordlist, queries);
64+
vector<string> inputArray;
65+
size_t pos = input_json_values.find('\n');
66+
while (pos != string::npos) {
67+
inputArray.push_back(input_json_values.substr(0, pos));
68+
input_json_values = input_json_values.substr(pos + 1);
69+
pos = input_json_values.find('\n');
70+
}
71+
inputArray.push_back(input_json_values);
72+
73+
Solution solution;
74+
vector<string> wordlist = json::parse(inputArray.at(0));
75+
vector<string> queries = json::parse(inputArray.at(1));
76+
return solution.spellchecker(wordlist, queries);
2977
}

problems/problems_966/Solution.java

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,42 @@
77

88
public class Solution extends BaseSolution {
99
public String[] spellchecker(String[] wordlist, String[] queries) {
10-
10+
int n = wordlist.length;
11+
Set<String> origin = new HashSet<>(Arrays.asList(wordlist));
12+
Map<String, String> lowerToOrigin = new HashMap<>(n); // 预分配空间
13+
Map<String, String> vowelToOrigin = new HashMap<>(n);
14+
15+
for (int i = n - 1; i >= 0; i--) {
16+
String s = wordlist[i];
17+
String lower = s.toLowerCase();
18+
lowerToOrigin.put(lower, s); // 例如 kite -> KiTe
19+
vowelToOrigin.put(replaceVowels(lower), s); // 例如 k?t? -> KiTe
20+
}
21+
22+
for (int i = 0; i < queries.length; i++) {
23+
String q = queries[i];
24+
if (origin.contains(q)) { // 完全匹配
25+
continue;
26+
}
27+
String lower = q.toLowerCase();
28+
if (lowerToOrigin.containsKey(lower)) { // 不区分大小写的匹配
29+
queries[i] = lowerToOrigin.get(lower);
30+
} else { // 不区分大小写+元音模糊匹配
31+
queries[i] = vowelToOrigin.getOrDefault(replaceVowels(lower), "");
32+
}
33+
}
34+
return queries;
35+
}
36+
37+
private String replaceVowels(String str) {
38+
char[] s = str.toCharArray();
39+
for (int i = 0; i < s.length; ++i) {
40+
char c = s[i];
41+
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
42+
s[i] = '?';
43+
}
44+
}
45+
return new String(s);
1146
}
1247

1348
@Override

problems/problems_966/solution.go

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,38 @@ package problem966
33
import (
44
"encoding/json"
55
"log"
6+
"slices"
67
"strings"
78
)
89

9-
func spellchecker(wordlist []string, queries []string) []string {
10-
10+
func spellchecker(wordlist, queries []string) []string {
11+
n := len(wordlist)
12+
origin := make(map[string]bool, n) // 预分配空间
13+
lowerToOrigin := make(map[string]string, n)
14+
vowelToOrigin := make(map[string]string, n)
15+
// 把元音都替换成 '?'
16+
vowelReplacer := strings.NewReplacer("a", "?", "e", "?", "i", "?", "o", "?", "u", "?")
17+
18+
for _, s := range slices.Backward(wordlist) {
19+
origin[s] = true
20+
lower := strings.ToLower(s)
21+
lowerToOrigin[lower] = s // 例如 kite -> KiTe
22+
vowelToOrigin[vowelReplacer.Replace(lower)] = s // 例如 k?t? -> KiTe
23+
}
24+
25+
for i, q := range queries {
26+
if origin[q] { // 完全匹配
27+
continue
28+
}
29+
lower := strings.ToLower(q)
30+
if s, ok := lowerToOrigin[lower]; ok { // 不区分大小写的匹配
31+
queries[i] = s
32+
} else { // 不区分大小写+元音模糊匹配
33+
queries[i] = vowelToOrigin[vowelReplacer.Replace(lower)]
34+
}
35+
}
36+
37+
return queries
1138
}
1239

1340
func Solve(inputJsonValues string) any {

problems/problems_966/solution.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,38 @@ def solve(self, test_input=None):
77
return self.spellchecker(*test_input)
88

99
def spellchecker(self, wordlist: List[str], queries: List[str]) -> List[str]:
10-
pass
10+
origin = set()
11+
ignore_cases = dict()
12+
ignore_vowels = dict()
1113

14+
def str_to_ignore_vowels(w: str) -> str:
15+
w = w.lower()
16+
res = []
17+
for c in w:
18+
if c in VOWELS:
19+
res.append('*')
20+
else:
21+
res.append(c)
22+
return "".join(res)
23+
24+
for word in wordlist:
25+
origin.add(word)
26+
if (l := word.lower()) not in ignore_cases:
27+
ignore_cases[l] = word
28+
if (l := str_to_ignore_vowels(word)) not in ignore_vowels:
29+
ignore_vowels[l] = word
30+
ans = []
31+
for query in queries:
32+
if query in origin:
33+
ans.append(query)
34+
continue
35+
if (l := query.lower()) in ignore_cases:
36+
ans.append(ignore_cases[l])
37+
continue
38+
if (l := str_to_ignore_vowels(query)) in ignore_vowels:
39+
ans.append(ignore_vowels[l])
40+
continue
41+
ans.append("")
42+
return ans
43+
44+
VOWELS = "aeiouAEIOU"

problems/problems_966/testcase

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
["[\"KiTe\",\"kite\",\"hare\",\"Hare\"]\n[\"kite\",\"Kite\",\"KiTe\",\"Hare\",\"HARE\",\"Hear\",\"hear\",\"keti\",\"keet\",\"keto\"]", "[\"yellow\"]\n[\"YellOw\"]"]
2-
[["kite", "KiTe", "KiTe", "Hare", "hare", "", "", "KiTe", "", "KiTe"], ["yellow"]]
1+
["[\"KiTe\",\"kite\",\"hare\",\"Hare\"]\n[\"kite\",\"Kite\",\"KiTe\",\"Hare\",\"HARE\",\"Hear\",\"hear\",\"keti\",\"keet\",\"keto\"]", "[\"yellow\"]\n[\"YellOw\"]", "[\"ae\",\"aa\"]\n[\"UU\"]"]
2+
[["kite", "KiTe", "KiTe", "Hare", "hare", "", "", "KiTe", "", "KiTe"], ["yellow"], ["ae"]]

problems/problems_966/testcase.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ def __init__(self):
99
self.testcases = []
1010
self.testcases.append(case(Input=[['KiTe', 'kite', 'hare', 'Hare'], ['kite', 'Kite', 'KiTe', 'Hare', 'HARE', 'Hear', 'hear', 'keti', 'keet', 'keto']], Output=['kite', 'KiTe', 'KiTe', 'Hare', 'hare', '', '', 'KiTe', '', 'KiTe']))
1111
self.testcases.append(case(Input=[['yellow'], ['YellOw']], Output=['yellow']))
12+
self.testcases.append(case(Input=[["ae","aa"],["UU"]], Output=["ae"]))
1213

1314
def get_testcases(self):
1415
return self.testcases

templates/binary/xor.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,28 @@ func singleNumber(nums []int) int {
2525
return ans
2626
}
2727
```
28+
29+
## 线性基求最大异或子集
30+
31+
```python
32+
def find_maximum_xor(arr):
33+
if not arr:
34+
return 0
35+
base = [0] * 32
36+
37+
for x in arr:
38+
for i in range(31, -1, -1):
39+
if (x >> i) & 1:
40+
if base[i]:
41+
x ^= base[i]
42+
else:
43+
base[i] = x
44+
break
45+
46+
res = 0
47+
for i in range(31, -1, -1):
48+
if base[i] != 0 and (res >> i) & 1 == 0:
49+
res ^= base[i]
50+
51+
return res
52+
```

0 commit comments

Comments
 (0)