8000 3 · javasharper/leetcode@316c365 · GitHub
[go: up one dir, main page]

Skip to content

Commit 316c365

Browse files
committed
3
1 parent c03c308 commit 316c365

File tree

1 file changed

+24
-67
lines changed

1 file changed

+24
-67
lines changed
Lines changed: 24 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,34 @@
11
class Solution {
22
public:
3-
// 1612ms
43
vector<int> findSubstring(string S, vector<string> &L) {
5-
// Start typing your C/C++ solution below
6-
// DO NOT write int main() function
7-
8-
int M = L.size();
9-
int N = L[0].size();
10-
11-
vector<int> indices;
12-
if (S.size() < M * N) return indices;
13-
14-
map<string, int> words_dict;
15-
for (int i = 0; i < M; i++)
16-
words_dict[L[i]] += 1;
17-
18-
for (int i = 0; i <= S.size() - M*N; i++) {
19-
map<string, int> has_found;
20-
bool flag = true;
21-
for (int j = 0; j < M; j++) {
22-
string sub_string = S.substr(i + j * N, N);
23-
if (words_dict.find(sub_string) == words_dict.end()) {
24-
flag = false; break;
25-
}
26-
has_found[sub_string] += 1;
27-
if (has_found[sub_string] > words_dict[sub_string]) {
28-
flag = false; break;
29-
}
30-
}
31-
if (flag) indices.push_back(i);
4+
vector<int> result;
5+
if (L.empty()) {
6+
return result;
327
}
33-
return indices;
34-
}
35-
};
36-
37-
//
38-
// Solution2 : 1356ms
39-
//
40-
class Solution {
41-
public:
42-
vector<int> findSubstring(string S, vector<string> &L) {
43-
// Start typing your C/C++ solution below
44-
// DO NOT write int main() function
45-
46-
int M = L.size();
47-
int N = L[0].size();
48-
49-
vector<int> indices;
50-
if (S.size() < M * N) return indices;
51-
52-
map<string, int> words_dict;
53-
for (int i = 0; i < M; i++)
54-
words_dict[L[i]] += 1;
55-
56-
for (int i = 0; i < N; i++) {
57-
vector<string> substrings;
58-
for (int j = i; j + N <= S.size(); j += N)
59-
substrings.push_back(S.substr(j, N));
60-
for (int j = 0; j + M <= substrings.size(); j++) {
61-
map<string, int> has_found;
62-
bool flag = true;
63-
for (int k = 0; k < M; k++) {
64-
if (words_dict.find(substrings[j+k]) == words_dict.end()) {
65-
flag = false; break;
8+
int n = L.size();
9+
int len = L[0].size();
10+
map<string, int> hash;
11+
for (int i = 0; i < n; i++) {
12+
hash[L[i]] += 1;
13+
}
14+
for (int i = 0; i < len; i++) {
15+
vector<string> slices;
16+
for (int j = i; j + len <= S.size(); j += len) {
17+
slices.push_back(S.substr(j, len));
18+
}
19+
for (int j = 0; j + n <= slices.size(); j++) {
20+
map<string, int> found;
21+
for (int k = 0; k < n; k++) {
22+
found[slices[j+k]] += 1;
23+
if (found[slices[j+k]] > hash[slices[j+k]]) {
24+
break;
6625
}
67-
has_found[substrings[j+k]] += 1;
68-
if (has_found[substrings[j+k]] > words_dict[substrings[j+k]]) {
69-
flag = false; break;
26+
if (k == n - 1) {
27+
result.push_back(i + j * len);
7028
}
7129
}
72-
if (flag) indices.push_back(i + j * N);
7330
}
7431
}
75-
return indices;
32+
return result;
7633
}
77-
};
34+
};

0 commit comments

Comments
 (0)
0