-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathproblem55.c
More file actions
146 lines (119 loc) Β· 3.22 KB
/
problem55.c
File metadata and controls
146 lines (119 loc) Β· 3.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define ALPHABET_SIZE 26
#define MAX_LENGTH 10001
typedef struct {
char ch;
int freq;
} CharFreq;
void swap(CharFreq *a, CharFreq *b) {
CharFreq temp = *a;
*a = *b;
*b = temp;
}
void heapifyDown(CharFreq heap[], int n, int i) {
int largest = i, left = 2*i + 1, right = 2*i + 2;
if (left < n && heap[left].freq > heap[largest].freq) largest = left;
if (right < n && heap[right].freq > heap[largest].freq) largest = right;
if (largest != i) {
swap(&heap[i], &heap[largest]);
heapifyDown(heap, n, largest);
}
}
void heapifyUp(CharFreq heap[], int i) {
while (i > 0 && heap[i].freq > heap[(i - 1) / 2].freq) {
swap(&heap[i], &heap[(i - 1) / 2]);
i = (i - 1) / 2;
}
}
void insertHeap(CharFreq heap[], int *size, CharFreq val) {
heap[(*size)++] = val;
heapifyUp(heap, *size - 1);
}
CharFreq removeMax(CharFreq heap[], int *size) {
CharFreq top = heap[0];
heap[0] = heap[--(*size)];
heapifyDown(heap, *size, 0);
return top;
}
int memoryCheck(void *ptr) {
if (!ptr) {
printf("Memory Allocation Failed\n");
return 1;
}
return 0;
}
char *readInputString() {
char *input = (char*)malloc(MAX_LENGTH * sizeof(char));
if (memoryCheck(input)) return NULL;
printf("Enter the initial banner string (lowercase letters only): ");
fgets(input, MAX_LENGTH, stdin);
input[strcspn(input, "\n")] = 0;
return input;
}
char *rearrangeString(char *s) {
int len = strlen(s);
int freq[ALPHABET_SIZE] = {0};
for (int i = 0; i < len; i++) {
if (!islower(s[i])) {
printf("Invalid character detected.\n");
return NULL;
}
freq[s[i] - 'a']++;
}
int maxFreq = 0;
for (int i = 0; i < ALPHABET_SIZE; i++) {
if (freq[i] > maxFreq)
maxFreq = freq[i];
}
if (maxFreq > (len + 1) / 2) {
char *empty = (char*)malloc(1);
if (memoryCheck(empty)) return NULL;
empty[0] = '\0';
return empty;
}
CharFreq heap[ALPHABET_SIZE];
int heapSize = 0;
for (int i = 0; i < ALPHABET_SIZE; i++) {
if (freq[i]) {
CharFreq cf = { (char)(i + 'a'), freq[i] };
insertHeap(heap, &heapSize, cf);
}
}
char *result = (char*)malloc((len + 1) * sizeof(char));
if (memoryCheck(result)) return NULL;
int index = 0;
CharFreq prev = { '#', 0 };
while (heapSize > 0) {
CharFreq current = removeMax(heap, &heapSize);
result[index++] = current.ch;
current.freq--;
if (prev.freq > 0)
insertHeap(heap, &heapSize, prev);
prev = current;
}
result[index] = '\0';
return result;
}
void displayResult(char *output) {
printf("Rearranged Banner: ");
if (strlen(output) == 0)
printf("Impossible to arrange without repetition.\n");
else
printf("%s\n", output);
}
int main() {
char *input = readInputString();
if (!input) return 1;
char *result = rearrangeString(input);
if (!result) {
free(input);
return 1;
}
displayResult(result);
free(input);
free(result);
return 0;
}