Find the total number of anagrams that a string contains of a substring

This commit is contained in:
Nick Chambers 2022-07-05 14:37:31 -05:00
parent 25b5b9090c
commit 91e97fb8b4
1 changed files with 62 additions and 0 deletions

62
c/anagram.c Normal file
View File

@ -0,0 +1,62 @@
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare(const void *lhs, const void *rhs) {
const char *left = lhs;
const char *right = rhs;
return *left > *right;
}
int main(int argc, char **argv) {
if(argc != 3) {
fprintf(stderr, "usage: %s <needle> <haystack>\n", argv[0]);
return 1;
}
char *needle = argv[1];
size_t needle_len = strlen(needle);
char *deeeln = malloc(needle_len);
if(!deeeln) {
fprintf(stderr, "malloc: %s\n", strerror(errno));
return 1;
}
strncpy(deeeln, needle, needle_len);
qsort(deeeln, needle_len, 1, compare);
char *haystack = argv[2];
size_t haystack_len = strlen(haystack);
char *aachksty = malloc(haystack_len);
if(!aachksty) {
fprintf(stderr, "malloc: %s\n", strerror(errno));
return 1;
}
size_t pos = 0;
char *idx = haystack;
unsigned int anagrams = 0;
for(; pos + needle_len <= haystack_len; pos += 1, idx += 1) {
strncpy(aachksty, idx, needle_len);
qsort(aachksty, needle_len, 1, compare);
if(strncmp(deeeln, aachksty, needle_len) == 0) {
anagrams += 1;
}
}
free(deeeln);
free(aachksty);
printf("%u anagram", anagrams);
if(anagrams != 1) {
printf("s");
}
printf("\n");
return 0;
}