Given two integer **N** and **K**, the task is to find the size of the smallest string that contains all permutations of length **N** that can be formed using first **D** digits **(0, 1, …, D-1)**.

**Examples:**

Input:N = 2, D = 2

Output:01100

Explanation:

Possible permutations of length 2 from digits (0, 1) are {00, 01, 10, 11}.

“01100” is one such string that contains all the permutations as a substring.

Other possible answers are “00110”, “10011”, “11001”

Input:N = 2, D = 4

Output:03322312113020100

Explaination:

Here all possible permutations of length 2 from digits {0, 1, 2, 3} are

00 10 20 30

01 11 21 31

02 12 22 32

03 13 23 33

“03322312113020100” is a string of minimum length that contains all the above permutations.

**Approach:**

Append ‘0’ N-1 times and call DFS on the string in the current state. Append all the D characters one by one. Every time after appending, check if the new string is visited or not. If so, mark it visited by inserting it into a HashSet and add this character in the answer. Recursively call the DFS function on the last D characters. Repeat this process until all possible substrings of N length from the D digits are appended to the string. Print the final string generated.

Below is the implementation of the above approach:

## Java

`// Java Program to find the ` `// minimum length string ` `// consisting of all ` `// permutations of length N ` `// of D digits ` `import` `java.io.*; ` `import` `java.util.*; ` `import` `java.lang.*; ` ` ` `class` `GeeksforGeeks { ` ` ` ` ` `// Initialize hashset to see ` ` ` `// if all the possible ` ` ` `// permutations are present ` ` ` `// in the min length string ` ` ` `static` `Set<String> visited; ` ` ` `// To keep min length string ` ` ` `static` `StringBuilder ans; ` ` ` ` ` `public` `static` `String reqString(` `int` `N, ` ` ` `int` `D) ` ` ` `{ ` ` ` `// Base case ` ` ` `if` `(N == ` `1` `&& D == ` `1` `) ` ` ` `return` `"0"` `; ` ` ` `visited = ` `new` `HashSet<>(); ` ` ` `ans = ` `new` `StringBuilder(); ` ` ` ` ` `StringBuilder sb = ` `new` `StringBuilder(); ` ` ` `// Append '0' n-1 times ` ` ` `for` `(` `int` `i = ` `0` `; i < N - ` `1` `; ++i) { ` ` ` `sb.append(` `"0"` `); ` ` ` `} ` ` ` `String start = sb.toString(); ` ` ` `// Call the DFS Function ` ` ` `dfs(start, D); ` ` ` `ans.append(start); ` ` ` ` ` `return` `new` `String(ans); ` ` ` `} ` ` ` `// Generate the required string ` ` ` `public` `static` `void` `dfs(String curr, ` `int` `D) ` ` ` `{ ` ` ` `// Iterate over all the possible ` ` ` `// character ` ` ` `for` `(` `int` `x = ` `0` `; x < D; ++x) { ` ` ` `// Append to make a new string ` ` ` `String neighbour = curr + x; ` ` ` `// If the new string is not ` ` ` `// visited ` ` ` `if` `(!visited.contains(neighbour)) { ` ` ` `// Add in hashset ` ` ` `visited.add(neighbour); ` ` ` `// Call the dfs function on ` ` ` `// the last d characters ` ` ` `dfs(neighbour.substring(` `1` `), D); ` ` ` ` ` `ans.append(x); ` ` ` `} ` ` ` `} ` ` ` `} ` ` ` `// Driver Code ` ` ` `public` `static` `void` `main(String args[]) ` ` ` `{ ` ` ` ` ` `int` `N = ` `2` `; ` ` ` `int` `D = ` `2` `; ` ` ` `System.out.println(reqString(N, D)); ` ` ` `} ` `} ` |

*chevron_right*

*filter_none*

**Output:**

01100

**Time Complexity:** O(N * D^{N})

**Auxiliary Space:** O(N * D^{N})

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.