Rearrange a string so that all same characters become atleast d distance away - GeeksforGeeks
Given a string and a positive integer d, rearrange characters of the given string such that the same characters become at-least d distance away from each other.
Note that there can be many possible rearrangements, the output should be one of the possible rearrangements. If no such arrangement is possible, that should also be reported.
Expected time complexity is O(n) where n is length of input string.
Read full article from Rearrange a string so that all same characters become atleast d distance away - GeeksforGeeks
Given a string and a positive integer d, rearrange characters of the given string such that the same characters become at-least d distance away from each other.
Note that there can be many possible rearrangements, the output should be one of the possible rearrangements. If no such arrangement is possible, that should also be reported.
Expected time complexity is O(n) where n is length of input string.
// The function returns next eligible character// with maximum frequency (Greedy!!) and// zero or negative distanceint nextChar(int freq[], int dist[]){ int max = INT_MIN; for (int i = 0; i < MAX_CHAR; i++) if (dist[i] <= 0 && freq[i] > 0 && (max == INT_MIN || freq[i] > freq[max])) max = i; return max;}// The main function that rearranges input string 'str'// such that two same characters become atleast d// distance awayint rearrange(char str[], char out[], int d){ // Find length of input string int n = strlen(str); // Create an array to store all characters and their // frequencies in str[] int freq[MAX_CHAR] = { 0 }; // Traverse the input string and store frequencies // of all characters in freq[] array. for (int i = 0; i < n; i++) freq[str[i]]++; // Create an array for inserting the values at // correct distance dist[j] stores the least distance // between current position and the next position we // can use character 'j' int dist[MAX_CHAR] = { 0 }; for (int i = 0; i < n; i++) { // find next eligible character int j = nextChar(freq, dist); // return 0 if string cannot be rearranged if (j == INT_MIN) return 0; // Put character j at next position out[i] = j; // decrease its frequency freq[j]--; // set distance as d dist[j] = d; // decrease distance of all characters by 1 for (int i = 0; i < MAX_CHAR; i++) dist[i]--; } // null terminate output string out[n] = '\0'; // return success return 1;}