Skip to content

Commit 9c8ee8d

Browse files
Merge pull request #544 from swainsubrat/master
Lexicographic rank of a string
2 parents 43d7d9c + 3846147 commit 9c8ee8d

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

Strings/lexicographicRank.cpp

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
Input : str[] = "acb"
3+
Output : Rank = 2
4+
5+
Input : str[] = "string"
6+
Output : Rank = 598
7+
8+
Input : str[] = "cba"
9+
Output : Rank = 6
10+
*/
11+
12+
// C++ program to find lexicographic rank
13+
// of a string
14+
#include <bits/stdc++.h>
15+
#include <string.h>
16+
17+
using namespace std;
18+
// A utility function to find factorial of n
19+
int fact(int n)
20+
{
21+
return (n <= 1) ? 1 : n * fact(n - 1);
22+
}
23+
24+
// A utility function to count smaller characters on right
25+
// of arr[low]
26+
int findSmallerInRight(char* str, int low, int high)
27+
{
28+
int countRight = 0, i;
29+
30+
for (i = low + 1; i <= high; ++i)
31+
if (str[i] < str[low])
32+
++countRight;
33+
34+
return countRight;
35+
}
36+
37+
// A function to find rank of a string in all permutations
38+
// of characters
39+
int findRank(char* str)
40+
{
41+
int len = strlen(str);
42+
int mul = fact(len);
43+
int rank = 1;
44+
int countRight;
45+
46+
int i;
47+
for (i = 0; i < len; ++i) {
48+
mul /= len - i;
49+
50+
// count number of chars smaller than str[i]
51+
// fron str[i+1] to str[len-1]
52+
countRight = findSmallerInRight(str, i, len - 1);
53+
54+
rank += countRight * mul;
55+
}
56+
57+
return rank;
58+
}
59+
60+
// Driver program to test above function
61+
int main()
62+
{
63+
char str[] = "string";
64+
cout << findRank(str);
65+
return 0;
66+
}
67+
68+
// This code is contributed by Subrat Kumar Swain

0 commit comments

Comments
 (0)