Skip to content

Commit 9a0b0db

Browse files
authored
feat: add solutions to lc problem: No.0030 (#3962)
No.0030.Substring with Concatenation of All Words
1 parent 880901c commit 9a0b0db

File tree

10 files changed

+364
-429
lines changed

10 files changed

+364
-429
lines changed

solution/0000-0099/0030.Substring with Concatenation of All Words/README.md

+120-147
Large diffs are not rendered by default.

solution/0000-0099/0030.Substring with Concatenation of All Words/README_EN.md

+120-147
Large diffs are not rendered by default.

solution/0000-0099/0030.Substring with Concatenation of All Words/Solution.cpp

+21-16
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,42 @@ class Solution {
22
public:
33
vector<int> findSubstring(string s, vector<string>& words) {
44
unordered_map<string, int> cnt;
5-
for (auto& w : words) {
6-
++cnt[w];
5+
for (const auto& w : words) {
6+
cnt[w]++;
77
}
8-
int m = s.size(), n = words.size(), k = words[0].size();
8+
99
vector<int> ans;
10+
int m = s.length(), n = words.size(), k = words[0].length();
11+
1012
for (int i = 0; i < k; ++i) {
11-
unordered_map<string, int> cnt1;
1213
int l = i, r = i;
13-
int t = 0;
14+
unordered_map<string, int> cnt1;
1415
while (r + k <= m) {
15-
string w = s.substr(r, k);
16+
string t = s.substr(r, k);
1617
r += k;
17-
if (!cnt.count(w)) {
18+
19+
if (!cnt.contains(t)) {
1820
cnt1.clear();
1921
l = r;
20-
t = 0;
2122
continue;
2223
}
23-
++cnt1[w];
24-
++t;
25-
while (cnt1[w] > cnt[w]) {
26-
string remove = s.substr(l, k);
24+
25+
cnt1[t]++;
26+
27+
while (cnt1[t] > cnt[t]) {
28+
string w = s.substr(l, k);
29+
if (--cnt1[w] == 0) {
30+
cnt1.erase(w);
31+
}
2732
l += k;
28-
--cnt1[remove];
29-
--t;
3033
}
31-
if (t == n) {
34+
35+
if (r - l == n * k) {
3236
ans.push_back(l);
3337
}
3438
}
3539
}
40+
3641
return ans;
3742
}
38-
};
43+
};

solution/0000-0099/0030.Substring with Concatenation of All Words/Solution.cs

+26-16
Original file line numberDiff line numberDiff line change
@@ -2,40 +2,50 @@ public class Solution {
22
public IList<int> FindSubstring(string s, string[] words) {
33
var cnt = new Dictionary<string, int>();
44
foreach (var w in words) {
5-
if (!cnt.ContainsKey(w)) {
6-
cnt[w] = 0;
5+
if (cnt.ContainsKey(w)) {
6+
cnt[w]++;
7+
} else {
8+
cnt[w] = 1;
79
}
8-
++cnt[w];
910
}
10-
int m = s.Length, n = words.Length, k = words[0].Length;
11+
1112
var ans = new List<int>();
13+
int m = s.Length, n = words.Length, k = words[0].Length;
14+
1215
for (int i = 0; i < k; ++i) {
16+
int l = i, r = i;
1317
var cnt1 = new Dictionary<string, int>();
14-
int l = i, r = i, t = 0;
1518
while (r + k <= m) {
16-
var w = s.Substring(r, k);
19+
var t = s.Substring(r, k);
1720
r += k;
18-
if (!cnt.ContainsKey(w)) {
21+
22+
if (!cnt.ContainsKey(t)) {
1923
cnt1.Clear();
20-
t = 0;
2124
l = r;
2225
continue;
2326
}
24-
if (!cnt1.ContainsKey(w)) {
25-
cnt1[w] = 0;
27+
28+
if (cnt1.ContainsKey(t)) {
29+
cnt1[t]++;
30+
} else {
31+
cnt1[t] = 1;
2632
}
27-
++cnt1[w];
28-
++t;
29-
while (cnt1[w] > cnt[w]) {
30-
--cnt1[s.Substring(l, k)];
33+
34+
while (cnt1[t] > cnt[t]) {
35+
var w = s.Substring(l, k);
36+
cnt1[w]--;
37+
if (cnt1[w] == 0) {
38+
cnt1.Remove(w);
39+
}
3140
l += k;
32-
--t;
3341
}
34-
if (t == n) {
42+
43+
if (r - l == n * k) {
3544
ans.Add(l);
3645
}
3746
}
3847
}
48+
3949
return ans;
4050
}
4151
}
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,34 @@
11
func findSubstring(s string, words []string) (ans []int) {
2-
cnt := map[string]int{}
2+
cnt := make(map[string]int)
33
for _, w := range words {
44
cnt[w]++
55
}
66
m, n, k := len(s), len(words), len(words[0])
77
for i := 0; i < k; i++ {
8-
cnt1 := map[string]int{}
9-
l, r, t := i, i, 0
8+
l, r := i, i
9+
cnt1 := make(map[string]int)
1010
for r+k <= m {
11-
w := s[r : r+k]
11+
t := s[r : r+k]
1212
r += k
13-
if _, ok := cnt[w]; !ok {
14-
l, t = r, 0
15-
cnt1 = map[string]int{}
13+
14+
if _, exists := cnt[t]; !exists {
15+
cnt1 = make(map[string]int)
16+
l = r
1617
continue
1718
}
18-
cnt1[w]++
19-
t++
20-
for cnt1[w] > cnt[w] {
21-
cnt1[s[l:l+k]]--
19+
cnt1[t]++
20+
for cnt1[t] > cnt[t] {
21+
w := s[l : l+k]
22+
cnt1[w]--
23+
if cnt1[w] == 0 {
24+
delete(cnt1, w)
25+
}
2226
l += k
23-
t--
2427
}
25-
if t == n {
28+
if r-l == n*k {
2629
ans = append(ans, l)
2730
}
2831
}
2932
}
3033
return
31-
}
34+
}
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,35 @@
11
class Solution {
22
public List<Integer> findSubstring(String s, String[] words) {
33
Map<String, Integer> cnt = new HashMap<>();
4-
for (String w : words) {
4+
for (var w : words) {
55
cnt.merge(w, 1, Integer::sum);
66
}
7-
int m = s.length(), n = words.length;
8-
int k = words[0].length();
97
List<Integer> ans = new ArrayList<>();
8+
int m = s.length(), n = words.length, k = words[0].length();
109
for (int i = 0; i < k; ++i) {
11-
Map<String, Integer> cnt1 = new HashMap<>();
1210
int l = i, r = i;
13-
int t = 0;
11+
Map<String, Integer> cnt1 = new HashMap<>();
1412
while (r + k <= m) {
15-
String w = s.substring(r, r + k);
13+
var t = s.substring(r, r + k);
1614
r += k;
17-
if (!cnt.containsKey(w)) {
15+
if (!cnt.containsKey(t)) {
1816
cnt1.clear();
1917
l = r;
20-
t = 0;
2118
continue;
2219
}
23-
cnt1.merge(w, 1, Integer::sum);
24-
++t;
25-
while (cnt1.get(w) > cnt.get(w)) {
26-
String remove = s.substring(l, l + k);
20+
cnt1.merge(t, 1, Integer::sum);
21+
while (cnt1.get(t) > cnt.get(t)) {
22+
String w = s.substring(l, l + k);
23+
if (cnt1.merge(w, -1, Integer::sum) == 0) {
24+
cnt1.remove(w);
25+
}
2726
l += k;
28-
cnt1.merge(remove, -1, Integer::sum);
29-
--t;
3027
}
31-
if (t == n) {
28+
if (r - l == n * k) {
3229
ans.add(l);
3330
}
3431
}
3532
}
3633
return ans;
3734
}
38-
}
35+
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
class Solution {
2+
23
/**
34
* @param String $s
45
* @param String[] $words
@@ -7,47 +8,53 @@ class Solution {
78
function findSubstring($s, $words) {
89
$cnt = [];
910
foreach ($words as $w) {
10-
if (!isset($cnt[$w])) {
11-
$cnt[$w] = 1;
12-
} else {
11+
if (isset($cnt[$w])) {
1312
$cnt[$w]++;
13+
} else {
14+
$cnt[$w] = 1;
1415
}
1516
}
17+
18+
$ans = [];
1619
$m = strlen($s);
1720
$n = count($words);
1821
$k = strlen($words[0]);
19-
$ans = [];
20-
for ($i = 0; $i < $k; ++$i) {
21-
$cnt1 = [];
22+
23+
for ($i = 0; $i < $k; $i++) {
2224
$l = $i;
2325
$r = $i;
24-
$t = 0;
26+
$cnt1 = [];
2527
while ($r + $k <= $m) {
26-
$w = substr($s, $r, $k);
28+
$t = substr($s, $r, $k);
2729
$r += $k;
28-
if (!array_key_exists($w, $cnt)) {
30+
31+
if (!isset($cnt[$t])) {
2932
$cnt1 = [];
3033
$l = $r;
31-
$t = 0;
3234
continue;
3335
}
34-
if (!isset($cnt1[$w])) {
35-
$cnt1[$w] = 1;
36+
37+
if (isset($cnt1[$t])) {
38+
$cnt1[$t]++;
3639
} else {
37-
$cnt1[$w]++;
40+
$cnt1[$t] = 1;
3841
}
39-
++$t;
40-
while ($cnt1[$w] > $cnt[$w]) {
41-
$remove = substr($s, $l, $k);
42+
43+
while ($cnt1[$t] > $cnt[$t]) {
44+
$w = substr($s, $l, $k);
45+
$cnt1[$w]--;
46+
if ($cnt1[$w] == 0) {
47+
unset($cnt1[$w]);
48+
}
4249
$l += $k;
43-
$cnt1[$remove]--;
44-
$t--;
4550
}
46-
if ($t == $n) {
51+
52+
if ($r - $l == $n * $k) {
4753
$ans[] = $l;
4854
}
4955
}
5056
}
57+
5158
return $ans;
5259
}
5360
}

solution/0000-0099/0030.Substring with Concatenation of All Words/Solution.py

+8-12
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,20 @@ def findSubstring(self, s: str, words: List[str]) -> List[int]:
55
k = len(words[0])
66
ans = []
77
for i in range(k):
8-
cnt1 = Counter()
98
l = r = i
10-
t = 0
9+
cnt1 = Counter()
1110
while r + k <= m:
12-
w = s[r : r + k]
11+
t = s[r : r + k]
1312
r += k
14-
if w not in cnt:
13+
if cnt[t] == 0:
1514
l = r
1615
cnt1.clear()
17-
t = 0
1816
continue
19-
cnt1[w] += 1
20-
t += 1
21-
while cnt1[w] > cnt[w]:
22-
remove = s[l : l + k]
17+
cnt1[t] += 1
18+
while cnt1[t] > cnt[t]:
19+
rem = s[l : l + k]
2320
l += k
24-
cnt1[remove] -= 1
25-
t -= 1
26-
if t == n:
21+
cnt1[rem] -= 1
22+
if r - l == n * k:
2723
ans.append(l)
2824
return ans

solution/0000-0099/0030.Substring with Concatenation of All Words/Solution.ts

+13-17
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,29 @@ function findSubstring(s: string, words: string[]): number[] {
33
for (const w of words) {
44
cnt.set(w, (cnt.get(w) || 0) + 1);
55
}
6-
const m = s.length;
7-
const n = words.length;
8-
const k = words[0].length;
96
const ans: number[] = [];
10-
for (let i = 0; i < k; ++i) {
7+
const [m, n, k] = [s.length, words.length, words[0].length];
8+
for (let i = 0; i < k; i++) {
9+
let [l, r] = [i, i];
1110
const cnt1: Map<string, number> = new Map();
12-
let l = i;
13-
let r = i;
14-
let t = 0;
1511
while (r + k <= m) {
16-
const w = s.slice(r, r + k);
12+
const t = s.substring(r, r + k);
1713
r += k;
18-
if (!cnt.has(w)) {
14+
if (!cnt.has(t)) {
1915
cnt1.clear();
2016
l = r;
21-
t = 0;
2217
continue;
2318
}
24-
cnt1.set(w, (cnt1.get(w) || 0) + 1);
25-
++t;
26-
while (cnt1.get(w)! - cnt.get(w)! > 0) {
27-
const remove = s.slice(l, l + k);
28-
cnt1.set(remove, cnt1.get(remove)! - 1);
19+
cnt1.set(t, (cnt1.get(t) || 0) + 1);
20+
while (cnt1.get(t)! > cnt.get(t)!) {
21+
const w = s.substring(l, l + k);
22+
cnt1.set(w, cnt1.get(w)! - 1);
23+
if (cnt1.get(w) === 0) {
24+
cnt1.delete(w);
25+
}
2926
l += k;
30-
--t;
3127
}
32-
if (t === n) {
28+
if (r - l === n * k) {
3329
ans.push(l);
3430
}
3531
}

0 commit comments

Comments
 (0)