Related Articles

# Print all combinations generated by characters of a numeric string which does not exceed N

• Difficulty Level : Hard
• Last Updated : 11 May, 2021

Given a numeric string S of length M and an integer N, the task is to find all distinct combinations of S (repetitions allowed) that are at most N.

Examples:

Input: S = “124”, N = 100
Output: 1, 11, 12, 14, 2, 21, 22, 24, 4, 41, 42, 44
Explanation: Combinations “111”, “112”, “122”, “124”, “412” are greater than 100. Therefore, these combinations are excluded from the output.

Input: S = “345”, N = 400
Output: 3, 33, 333, 334, 335, 34, 343, 344, 345, 35, 353, 354, 355, 4, 43, 44, 45, 5, 53, 54, 55

Approach: The idea is to generate all the numbers possible using Backtracking and then print those numbers which does not exceed N. Follow the steps below to solve the problem:

• Initialize a Set of strings, say combinations[], to store all distinct combinations of S that numerically does not exceed N.
• Initialize a string ans to store the current combination of numbers possible from S.
• Declare a function generateCombinations() to generate all required combinations whose values are less than the given value N and the function is defined as:
• Traverse the string S over the range [0, M] using the variable i and do the following:
• Push the current character S[i] to ans and convert the current string ans to the number and store it in x.
• If x is less than or equal to N then push the string ans into combinations[] and recursively call the function generateCombinations().
• Backtrack to its previous state by removing the ith character from ans.
• After completing the above steps, print the set of all strings stored in combinations[].

Below is the implementation of the above approach:

## C++

 `// C++ program for the above approach``#include ``using` `namespace` `std;` `// Store the current sequence of s``string combination;` `// Store the all the required sequences``set combinations;` `// Function to print all sequences of S``// satisfying the required condition``void` `printSequences(``    ``set combinations)``{``    ``// Print all strings in the set``    ``for` `(string s : combinations) {``        ``cout << s << ``' '``;``    ``}``}` `// Function to generate all sequences``// of string S that are at most N``void` `generateCombinations(string& s, ``int` `n)``{` `    ``// Iterate over string s``    ``for` `(``int` `i = 0; i < s.size(); i++) {` `        ``// Push ith character to combination``        ``combination.push_back(s[i]);` `        ``// Convert the string to number``        ``long` `x = stol(combination);` `        ``// Check if the condition is true``        ``if` `(x <= n) {` `            ``// Push the current string to``            ``// the final set of sequences``            ``combinations.insert(combination);` `            ``// Recursively call function``            ``generateCombinations(s, n);``        ``}` `        ``// Backtrack to its previous state``        ``combination.pop_back();``    ``}``}` `// Driver Code``int` `main()``{``    ``string S = ``"124"``;``    ``int` `N = 100;` `    ``// Function Call``    ``generateCombinations(S, N);` `    ``// Print required sequences``    ``printSequences(combinations);` `    ``return` `0;``}`

## Java

 `// Java program for the above approach``import` `java.util.*;` `class` `GFG{` `// Store the current sequence of s``static` `String combination = ``""``;` `// Store the all the required sequences``static` `HashSet combinations = ``new` `LinkedHashSet();` `// Function to print all sequences of S``// satisfying the required condition``static` `void` `printSequences(``    ``HashSet combinations)``{``    ` `    ``// Print all Strings in the set``    ``for``(String s : combinations)``    ``{``        ``System.out.print(s + ``" "``);``    ``}``}` `// Function to generate all sequences``// of String S that are at most N``static` `void` `generateCombinations(String s, ``int` `n)``{``    ` `    ``// Iterate over String s``    ``for``(``int` `i = ``0``; i < s.length(); i++)``    ``{``        ` `        ``// Push ith character to combination``        ``combination += (s.charAt(i));` `        ``// Convert the String to number``        ``long` `x = Integer.valueOf(combination);` `        ``// Check if the condition is true``        ``if` `(x <= n)``        ``{``            ` `            ``// Push the current String to``            ``// the final set of sequences``            ``combinations.add(combination);` `            ``// Recursively call function``            ``generateCombinations(s, n);``        ``}` `        ``// Backtrack to its previous state``        ``combination = combination.substring(``            ``0``, combination.length() - ``1``);``    ``}``}` `// Driver Code``public` `static` `void` `main(String[] args)``{``    ``String S = ``"124"``;``    ``int` `N = ``100``;``    ` `    ``// Function Call``    ``generateCombinations(S, N);` `    ``// Print required sequences``    ``printSequences(combinations);``}``}` `// This code is contributed by Amit Katiyar`

## Python3

 `# Python3 program for the above approach` `# Store the current sequence of s``combination ``=` `"";` `# Store the all the required sequences``combinations ``=` `[];` `# Function to print all sequences of S``# satisfying the required condition``def` `printSequences(combinations) :``    ` `    ``# Print all strings in the set``    ``for` `s ``in` `(combinations) :``        ``print``(s, end ``=` `' '``);`` ` `# Function to generate all sequences``# of string S that are at most N``def` `generateCombinations(s, n) :   ``    ``global` `combination;` `    ``# Iterate over string s``    ``for` `i ``in` `range``(``len``(s)) :` `        ``# Push ith character to combination``        ``combination ``+``=` `s[i];` `        ``# Convert the string to number``        ``x ``=` `int``(combination);` `        ``# Check if the condition is true``        ``if` `(x <``=` `n) :` `            ``# Push the current string to``            ``# the final set of sequences``            ``combinations.append(combination);` `            ``# Recursively call function``            ``generateCombinations(s, n);` `        ``# Backtrack to its previous state``        ``combination ``=` `combination[:``-``1``];` `# Driver Code``if` `__name__ ``=``=` `"__main__"` `:` `    ``S ``=` `"124"``;``    ``N ``=` `100``;` `    ``# Function Call``    ``generateCombinations(S, N);` `    ``# Print required sequences``    ``printSequences(combinations);` `    ``# This code is contributed by AnkThon`

## C#

 `// C# program for the above approach``using` `System;``using` `System.Collections.Generic;``class` `GFG``{` `// Store the current sequence of s``static` `String combination = ``""``;` `// Store the all the required sequences``static` `SortedSet combinations = ``new` `SortedSet();` `// Function to print all sequences of S``// satisfying the required condition``static` `void` `printSequences(``    ``SortedSet combinations)``{``    ` `    ``// Print all Strings in the set``    ``foreach``(String s ``in` `combinations)``    ``{``        ``Console.Write(s + ``" "``);``    ``}``}` `// Function to generate all sequences``// of String S that are at most N``static` `void` `generateCombinations(String s, ``int` `n)``{``    ` `    ``// Iterate over String s``    ``for``(``int` `i = 0; i < s.Length; i++)``    ``{``        ` `        ``// Push ith character to combination``        ``combination += (s[i]);` `        ``// Convert the String to number``        ``long` `x = Int32.Parse(combination);` `        ``// Check if the condition is true``        ``if` `(x <= n)``        ``{``            ` `            ``// Push the current String to``            ``// the readonly set of sequences``            ``combinations.Add(combination);` `            ``// Recursively call function``            ``generateCombinations(s, n);``        ``}` `        ``// Backtrack to its previous state``        ``combination = combination.Substring(``            ``0, combination.Length - 1);``    ``}``}` `// Driver Code``public` `static` `void` `Main(String[] args)``{``    ``String S = ``"124"``;``    ``int` `N = 100;``    ` `    ``// Function Call``    ``generateCombinations(S, N);` `    ``// Print required sequences``    ``printSequences(combinations);``}``}` `// This code is contributed by 29AjayKumar`

## Javascript

 ``
Output:
`1 11 12 14 2 21 22 24 4 41 42 44`

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

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

My Personal Notes arrow_drop_up