From 91e97fb8b4eb92b1f90ac2ee7782a0b98917cd31 Mon Sep 17 00:00:00 2001 From: Nick Chambers Date: Tue, 5 Jul 2022 14:37:31 -0500 Subject: [PATCH] Find the total number of anagrams that a string contains of a substring --- c/anagram.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 c/anagram.c diff --git a/c/anagram.c b/c/anagram.c new file mode 100644 index 0000000..2b768c6 --- /dev/null +++ b/c/anagram.c @@ -0,0 +1,62 @@ +#include +#include +#include +#include + +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 \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; +}