# Lexicographic rank of a Binary String

• Last Updated : 29 Jan, 2022

Given a binary string S of length N, the task is to find the lexicographic rank of the given string.

Examples:

Input: S = “001”
Output: 8
Explanation:
Strings in order of their increasing rank:
“0” = 1,
“1” = 2,
“00” = 3,
“01” = 4,
“10” = 5,
“11” = 6,
“000” = 7,
“001” = 8.

Input: S = “01”
Output: 4

Naive Approach: The simplest approach is to generate all possible binary strings (consisting of 0s and 1s) up to length N and store them in an array. Once done, sort the array of strings in lexicographic order and print the index of the given string in the array.
Time Complexity: O(2N)
Auxiliary Space: O(1)

Efficient Approach: The idea is to generate a binary string consisting of 0s and 1s by replacing every occurrence of ‘a’ with 0 and ‘b’ with 1. Therefore, the strings in the list become:

“a” = 0,
“b” = 1,
“aa” = 00,
“ab” = 01,
“ba” = 10,
“bb” = 11,
“aaa” = 000,
“aab” = 001 and so on.

It can be observed that for a string of size N, there exist (2N – 2) strings of length less than N before that given string. Let it be equal to X. Now, its lexicographic position among strings of length N can be calculated by converting the string into its decimal equivalent number and adding 1 to it. Let it be equal to Y.

Rank of a string = X + Y + 1
= (2N – 2) + Y + 1
= 2N + Y – 1

Below is the implementation of the above approach:

## C++

 `//C++ program for the above approach``#include ``using` `namespace` `std;` `// Function to find the rank of a string``void` `findRank(string s)``{` `  ``// Store the length of the string``  ``int` `N = s.size();` `  ``// Stores its equivalent decimal value``  ``string bin;` `  ``// Traverse the string``  ``for` `(``int` `i = 0; i < N; i++)``  ``{``    ``if` `(s[i] == ``'0'``)``      ``bin += ``"0"``;``    ``else``      ``bin += ``"1"``;``  ``}``  ` `  ``// Store the number of strings of``  ``// length less than N occurring``  ``// before the given string``  ``long` `long` `X = 1ll<= 0; i--)``  ``{``    ``if` `(bin[i] == ``'1'``) ``      ``res += (val);` `    ``val *= 2ll;``  ``}` `  ``long` `long` `Y = res;` `  ``// Store the rank in answer``  ``long` `ans = X + Y - 1;` `  ``// Print the answer``  ``cout << ans;``}` `// Driver program``int` `main()``{``  ``string S = ``"001"``;``  ``findRank(S);``  ``return` `0;``}` `// This code is contributed by jyoti369.`

## Java

 `// Java program for the above approach``import` `java.io.*;``import` `java.lang.*;``import` `java.util.*;``public` `class` `Main {` `    ``// Function to find the rank of a string``    ``static` `void` `findRank(String s)``    ``{``        ``// Store the length of the string``        ``int` `N = s.length();` `        ``// Stores its equivalent decimal value``        ``StringBuilder sb = ``new` `StringBuilder(``""``);` `        ``// Traverse the string``        ``for` `(``int` `i = ``0``; i < N; i++) {` `            ``if` `(s.charAt(i) == ``'0'``)``                ``sb.append(``'0'``);``            ``else``                ``sb.append(``'1'``);``        ``}` `        ``String bin = sb.toString();` `        ``// Store the number of strings of``        ``// length less than N occurring``        ``// before the given string``        ``long` `X = (``long``)Math.pow(``2``, N);` `        ``// Store the decimal equivalent``        ``// number of string bin``        ``long` `Y = Long.parseLong(bin, ``2``);` `        ``// Store the rank in answer``        ``long` `ans = X + Y - ``1``;` `        ``// Print the answer``        ``System.out.println(ans);``    ``}` `    ``// Driver Code``    ``public` `static` `void` `main(String[] args)``    ``{``        ``String S = ``"001"``;``        ``findRank(S);``    ``}``}`

## Python3

 `# Python program for the above approach`  `# Function to find the rank of a string``def` `findRank(s):``  ` `    ``# Store the length of the string``    ``N ``=` `len``(s);` `    ``# Stores its equivalent decimal value``    ``sb ``=` `"";` `    ``# Traverse the string``    ``for` `i ``in` `range``(``0``,N):` `        ``if` `(s[i] ``=``=` `'0'``):``            ``sb ``+``=` `str``(``'0'``);``        ``else``:``            ``sb ``+``=` `str``(``'1'``);` `    ``bin` `=` `str``(sb);` `    ``# Store the number of strings of``    ``# length less than N occurring``    ``# before the given string``    ``X ``=` `pow``(``2``, N);` `    ``# Store the decimal equivalent``    ``# number of string bin``    ``Y ``=` `int``(``bin``);` `    ``# Store the rank in answer``    ``ans ``=` `X ``+` `Y ``-` `1``;` `    ``# Print the answer``    ``print``(ans);` `# Driver Code``if` `__name__ ``=``=` `'__main__'``:``    ``S ``=` `"001"``;``    ``findRank(S);` `# This code is contributed by shikhasingrajput`

## C#

 `// C# program to implement``// the above approach``using` `System;` `class` `GFG``{``  ` `// Function to find the rank of a String``static` `void` `findRank(``string` `s)``{` `  ``// Store the length of the String``  ``int` `N = s.Length;` `  ``// Stores its equivalent decimal value``  ``string` `bin = ``""``;` `  ``// Traverse the String``  ``for` `(``int` `i = 0; i < N; i++)``  ``{``    ``if` `(s[i] == ``'0'``)``      ``bin += ``"0"``;``    ``else``      ``bin += ``"1"``;``  ``}``  ` `  ``// Store the number of string s of``  ``// length less than N occurring``  ``// before the given String``  ``int` `X = 1<= 0; i--)``  ``{``    ``if` `(bin[i] == ``'1'``) ``      ``res += (val);` `    ``val *= 2;``  ``}``  ``int` `Y = res;` `  ``// Store the rank in answer``  ``int` `ans = X + Y - 1;` `  ``// Print the answer``  ``Console.Write(ans);``}` `// Driver Code``public` `static` `void` `Main()``{``   ``string` `S = ``"001"``;``    ``findRank(S);``}``}` `// This code is contributed by splevel62.`

## Javascript

 ``

Output:

`8`

Time Complexity: O(N)
Auxiliary Space: O(N)

My Personal Notes arrow_drop_up