Skip to content

Commit de10bd9

Browse files
authored
Merge pull request neetcode-gh#2220 from seinlin/438
Add 0438-find-all-anagrams-in-a-string.c
2 parents 40c68ec + fe042d9 commit de10bd9

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#define TO_INDEX(c) c - 'a'
2+
3+
bool isEquals(int* a, int* b, int n) {
4+
for (int i = 0; i < n; i++) {
5+
if (a[i] != b[i]) {
6+
return false;
7+
}
8+
}
9+
return true;
10+
}
11+
12+
/**
13+
* Note: The returned array must be malloced, assume caller calls free().
14+
*/
15+
int* findAnagrams(char * s, char * p, int* returnSize) {
16+
int sSize = strlen(s);
17+
int pSize = strlen(p);
18+
int pFreq[26] = {0};
19+
int sFreq[26] = {0};
20+
int i, count;
21+
int* ans;
22+
23+
if (sSize < pSize) {
24+
*returnSize = 0;
25+
return ans;
26+
}
27+
28+
for (i = 0; i < pSize; i++) {
29+
pFreq[TO_INDEX(p[i])]++;
30+
sFreq[TO_INDEX(s[i])]++;
31+
}
32+
33+
count = 0;
34+
ans = (int*)calloc(sSize - pSize + 1, sizeof(int));
35+
for (i = 0; i <= sSize - pSize; i++) {
36+
if (i > 0) {
37+
sFreq[TO_INDEX(s[i - 1])]--;
38+
sFreq[TO_INDEX(s[i + pSize - 1])]++;
39+
}
40+
if (isEquals(sFreq, pFreq, 26)) {
41+
ans[count++] = i;
42+
}
43+
}
44+
*returnSize = count;
45+
46+
return ans;
47+
}

0 commit comments

Comments
 (0)