HackerRank Permutations of Strings solution in c YASH PAL, 31 July 202431 July 2024 In this HackerRank Permutations of Strings in c programming problem solution you have Strings are usually ordered in lexicographical order. That means they are ordered by comparing their leftmost different characters. For example, abc<abd because c<d. Also z>yyy because z>y. If one string is an exact prefix of the other it is lexicographically smaller, e.g., gh<ghij. Given an array of strings sorted in lexicographical order, print all of its permutations in strict lexicographical order. If two permutations look the same, only print one of them. See the ‘note’ below for an example. Complete the function next_permutation which generates the permutations in the described order. For example, s=[ab,bc,cd]. The six permutations in correct order are: ab bc cd ab cd bc bc ab cd bc cd ab cd ab bc cd bc ab Permutations of strings HackerRank Permutations of strings problem solution in c programming. #include <stdio.h> #include <stdlib.h> #include <string.h> int next_permutation(int n, char **s){ // Find non-increasing suffix int i = n-1; while(i>0 && strcmp(s[i-1],s[i])>=0) i--; // find key if (i<=0) return 0; // Swap key with its successor in suffix int j = n-1; while(strcmp(s[i-1],s[j])>=0) j--; // find rightmost successor to key char *tmp = s[i-1]; s[i-1] = s[j]; s[j] = tmp; // Reverse the suffix j = n-1; while(i<j) { tmp = s[i]; s[i] = s[j]; s[j] = tmp; i++; j--; } return 1; } int main() { char **s; int n; scanf("%d", &n); s = calloc(n, sizeof(char*)); for (int i = 0; i < n; i++) { s[i] = calloc(11, sizeof(char)); scanf("%s", s[i]); } do { for (int i = 0; i < n; i++) printf("%s%c", s[i], i == n - 1 ? '\n' : ' '); } while (next_permutation(n, s)); for (int i = 0; i < n; i++) free(s[i]); free(s); return 0; } Second solution #include <stdio.h> #include <stdlib.h> #include <string.h> int next_permutation(int n, char **s) { /** * Complete this method * Return 0 when there is no next permutation and 1 otherwise * Modify array s to its next permutation */ for (int i = n - 1; i > 0; i--) if (strcmp(s[i], s[i - 1]) > 0) { int j = i + 1; for (; j < n; j++) if (strcmp(s[j], s[i - 1]) <= 0) break; char *t = s[i - 1]; s[i - 1] = s[j - 1]; s[j - 1] = t; for (; i < n - 1; i++, n--) { t = s[i]; s[i] = s[n - 1]; s[n - 1] = t; } return 1; } for (int i = 0; i < n - 1; i++, n--) { char *t = s[i]; s[i] = s[n - 1]; s[n - 1] = t; } return 0; } int main() { char **s; int n; scanf("%d", &n); s = calloc(n, sizeof(char*)); for (int i = 0; i < n; i++) { s[i] = calloc(n, sizeof(char) * 11); scanf("%s", s[i]); } do { for (int i = 0; i < n; i++) printf("%s%c", s[i], i == n - 1 ? '\n' : ' '); } while (next_permutation(n, s)); for (int i = 0; i < n; i++) free(s[i]); free(s); return 0; } c coding problems hackerrank solutions cHackerRank