mirror of
https://github.com/theoludwig/programming-challenges.git
synced 2025-05-18 12:02:53 +02:00
fix(solutions): fix: more memory issues thanks to -fsanitize=address flag with gcc
This commit is contained in:
@ -6,6 +6,8 @@ Created by [@theoludwig](https://github.com/theoludwig) on 8 November 2021.
|
||||
|
||||
Write a program that generates all possible unique permutations of a string.
|
||||
|
||||
The order of the generated permutations is important, see the example below.
|
||||
|
||||
## Source
|
||||
|
||||
- [Heap's Algorithm - Wikipedia](https://en.wikipedia.org/wiki/Heap%27s_algorithm)
|
||||
@ -25,10 +27,10 @@ abc
|
||||
```txt
|
||||
abc
|
||||
bac
|
||||
cba
|
||||
bca
|
||||
cab
|
||||
acb
|
||||
bca
|
||||
cba
|
||||
```
|
||||
|
||||
See the `test` folder for examples of input/output.
|
||||
|
@ -5,34 +5,21 @@
|
||||
|
||||
#include "input.h"
|
||||
|
||||
char *swap(char *string, size_t index_from, size_t index_target) {
|
||||
size_t string_length = strlen(string);
|
||||
char *result = malloc(sizeof(char *) * (string_length));
|
||||
for (size_t index = 0; index < string_length; index++) {
|
||||
if (index == index_from) {
|
||||
result[index] = string[index_target];
|
||||
} else if (index == index_target) {
|
||||
result[index] = string[index_from];
|
||||
} else {
|
||||
result[index] = string[index];
|
||||
}
|
||||
}
|
||||
return result;
|
||||
void swap(char *string, size_t index_from, size_t index_target) {
|
||||
char temporary = string[index_from];
|
||||
string[index_from] = string[index_target];
|
||||
string[index_target] = temporary;
|
||||
}
|
||||
|
||||
void heap_algorithm(unsigned long number_of_elements_to_operate, char *string) {
|
||||
void heap_algorithm(char *string, size_t number_of_elements_to_operate) {
|
||||
if (number_of_elements_to_operate == 1) {
|
||||
printf("%s\n", string);
|
||||
} else {
|
||||
heap_algorithm(number_of_elements_to_operate - 1, string);
|
||||
heap_algorithm(string, number_of_elements_to_operate - 1);
|
||||
for (size_t index = 0; index < number_of_elements_to_operate - 1; index++) {
|
||||
bool is_even = number_of_elements_to_operate % 2 == 0;
|
||||
if (!is_even) {
|
||||
string = swap(string, index, number_of_elements_to_operate - 1);
|
||||
} else {
|
||||
string = swap(string, 0, number_of_elements_to_operate - 1);
|
||||
}
|
||||
heap_algorithm(number_of_elements_to_operate - 1, string);
|
||||
swap(string, is_even ? index : 0, number_of_elements_to_operate - 1);
|
||||
heap_algorithm(string, number_of_elements_to_operate - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -40,6 +27,7 @@ void heap_algorithm(unsigned long number_of_elements_to_operate, char *string) {
|
||||
int main() {
|
||||
char *string = input();
|
||||
size_t string_length = strlen(string);
|
||||
heap_algorithm(string_length, string);
|
||||
heap_algorithm(string, string_length);
|
||||
free(string);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
abc
|
||||
bac
|
||||
cba
|
||||
bca
|
||||
cab
|
||||
acb
|
||||
acb
|
||||
bca
|
||||
cba
|
@ -1,24 +1,24 @@
|
||||
cool
|
||||
ocol
|
||||
oocl
|
||||
oocl
|
||||
ocol
|
||||
cool
|
||||
oocl
|
||||
oocl
|
||||
loco
|
||||
olco
|
||||
cloo
|
||||
lcoo
|
||||
oclo
|
||||
colo
|
||||
colo
|
||||
oclo
|
||||
lcoo
|
||||
cloo
|
||||
olco
|
||||
loco
|
||||
looc
|
||||
oloc
|
||||
oolc
|
||||
oolc
|
||||
oloc
|
||||
looc
|
||||
cool
|
||||
ocol
|
||||
oocl
|
||||
oocl
|
||||
ocol
|
||||
cool
|
||||
looc
|
||||
oloc
|
||||
oolc
|
||||
oolc
|
||||
oloc
|
||||
looc
|
||||
oolc
|
@ -1,120 +1,120 @@
|
||||
kayak
|
||||
akyak
|
||||
yakak
|
||||
aykak
|
||||
ykaak
|
||||
kyaak
|
||||
aaykk
|
||||
aaykk
|
||||
yaakk
|
||||
ayakk
|
||||
yaakk
|
||||
ayakk
|
||||
kayak
|
||||
aykak
|
||||
yakak
|
||||
aakyk
|
||||
aakyk
|
||||
kaayk
|
||||
akayk
|
||||
akayk
|
||||
kaayk
|
||||
kyaak
|
||||
ykaak
|
||||
akyak
|
||||
yakak
|
||||
aykak
|
||||
ykaak
|
||||
kyaak
|
||||
aaykk
|
||||
aaykk
|
||||
yaakk
|
||||
ayakk
|
||||
yaakk
|
||||
ayakk
|
||||
kayak
|
||||
akyak
|
||||
yakak
|
||||
aykak
|
||||
ykaak
|
||||
kyaak
|
||||
ayakk
|
||||
yaakk
|
||||
aaykk
|
||||
aaykk
|
||||
yaakk
|
||||
ayakk
|
||||
yaakk
|
||||
ayakk
|
||||
kayak
|
||||
akyak
|
||||
yakak
|
||||
aykak
|
||||
ykaak
|
||||
kyaak
|
||||
aaykk
|
||||
aaykk
|
||||
yaakk
|
||||
ayakk
|
||||
yaakk
|
||||
ayakk
|
||||
kkyaa
|
||||
kkyaa
|
||||
ykkaa
|
||||
kykaa
|
||||
ykkaa
|
||||
kykaa
|
||||
kyaka
|
||||
ykaka
|
||||
akyka
|
||||
kayka
|
||||
ykaka
|
||||
kyaka
|
||||
yakka
|
||||
aykka
|
||||
kykaa
|
||||
ykkaa
|
||||
kkyaa
|
||||
kkyaa
|
||||
ykkaa
|
||||
kykaa
|
||||
kakya
|
||||
akkya
|
||||
kkaya
|
||||
kkaya
|
||||
akkya
|
||||
kakya
|
||||
kayka
|
||||
akyka
|
||||
ykaka
|
||||
kyaka
|
||||
aykka
|
||||
yakka
|
||||
aakky
|
||||
aakky
|
||||
kaaky
|
||||
akaky
|
||||
akaky
|
||||
kaaky
|
||||
kaaky
|
||||
akaky
|
||||
akaky
|
||||
kaaky
|
||||
aakky
|
||||
aakky
|
||||
akkay
|
||||
kakay
|
||||
kakay
|
||||
akkay
|
||||
kkaay
|
||||
kkaay
|
||||
kkaay
|
||||
kkaay
|
||||
akkay
|
||||
kakay
|
||||
kakay
|
||||
akkay
|
||||
ykkaa
|
||||
kykaa
|
||||
kykaa
|
||||
ykkaa
|
||||
kkyaa
|
||||
kkyaa
|
||||
akyka
|
||||
kayka
|
||||
ykaka
|
||||
kyaka
|
||||
yakka
|
||||
aykka
|
||||
kkaay
|
||||
kkaay
|
||||
akkay
|
||||
kakay
|
||||
akkay
|
||||
kakay
|
||||
akaky
|
||||
kaaky
|
||||
akaky
|
||||
kaaky
|
||||
aakky
|
||||
aakky
|
||||
kkaay
|
||||
kkaay
|
||||
akkay
|
||||
kakay
|
||||
akkay
|
||||
kakay
|
||||
akaky
|
||||
kaaky
|
||||
akaky
|
||||
kaaky
|
||||
aakky
|
||||
aakky
|
||||
kkaya
|
||||
kkaya
|
||||
akkya
|
||||
kakya
|
||||
akkya
|
||||
kakya
|
||||
kyaka
|
||||
ykaka
|
||||
ykaka
|
||||
kyaka
|
||||
akyka
|
||||
kayka
|
||||
aykka
|
||||
yakka
|
||||
kkaya
|
||||
kkaya
|
||||
akkya
|
||||
kakya
|
||||
akkya
|
||||
kakya
|
||||
ykaka
|
||||
kyaka
|
||||
akyka
|
||||
kayka
|
||||
aykka
|
||||
yakka
|
||||
akyka
|
||||
akkya
|
||||
kakya
|
||||
kakya
|
||||
akkya
|
||||
kkaya
|
||||
kkaya
|
||||
akayk
|
||||
kaayk
|
||||
aakyk
|
||||
aakyk
|
||||
kaayk
|
||||
akayk
|
||||
ykaak
|
||||
kyaak
|
||||
aykak
|
||||
yakak
|
||||
kayak
|
||||
akyak
|
||||
aaykk
|
||||
aaykk
|
||||
yaakk
|
||||
ayakk
|
||||
ayakk
|
||||
yaakk
|
||||
yakak
|
||||
aykak
|
||||
kyaak
|
||||
ykaak
|
||||
akyak
|
||||
kayak
|
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user