Given a set of characters and a positive integer k, print all possible strings of length k that can be formed from the given set.
Examples:
Input:
set[] = {'a', 'b'}, k = 3
Output:
aaa
aab
aba
abb
baa
bab
bba
bbb
Input:
set[] = {'a', 'b', 'c', 'd'}, k = 1
Output:
a
b
c
d
For a given set of size n, there will be n^k possible strings of length k. The idea is to start from an empty output string (we call it prefix in following code). One by one add all characters to prefix. For every character added, print all possible strings with current prefix by recursively calling for k equals to k-1.
Below is the implementation of above idea :
C++
#include <bits/stdc++.h>
using namespace std;
void printAllKLengthRec( char set[], string prefix,
int n, int k)
{
if (k == 0)
{
cout << (prefix) << endl;
return ;
}
for ( int i = 0; i < n; i++)
{
string newPrefix;
newPrefix = prefix + set[i];
printAllKLengthRec(set, newPrefix, n, k - 1);
}
}
void printAllKLength( char set[], int k, int n)
{
printAllKLengthRec(set, "" , n, k);
}
int main()
{
cout << "First Test" << endl;
char set1[] = { 'a' , 'b' };
int k = 3;
printAllKLength(set1, k, 2);
cout << "Second Test\n" ;
char set2[] = { 'a' , 'b' , 'c' , 'd' };
k = 1;
printAllKLength(set2, k, 4);
}
|
Java
class GFG {
static void printAllKLength( char [] set, int k)
{
int n = set.length;
printAllKLengthRec(set, "" , n, k);
}
static void printAllKLengthRec( char [] set,
String prefix,
int n, int k)
{
if (k == 0 )
{
System.out.println(prefix);
return ;
}
for ( int i = 0 ; i < n; ++i)
{
String newPrefix = prefix + set[i];
printAllKLengthRec(set, newPrefix,
n, k - 1 );
}
}
public static void main(String[] args)
{
System.out.println( "First Test" );
char [] set1 = { 'a' , 'b' };
int k = 3 ;
printAllKLength(set1, k);
System.out.println( "\nSecond Test" );
char [] set2 = { 'a' , 'b' , 'c' , 'd' };
k = 1 ;
printAllKLength(set2, k);
}
}
|
Python3
def printAllKLength( set , k):
n = len ( set )
printAllKLengthRec( set , "", n, k)
def printAllKLengthRec( set , prefix, n, k):
if (k = = 0 ) :
print (prefix)
return
for i in range (n):
newPrefix = prefix + set [i]
printAllKLengthRec( set , newPrefix, n, k - 1 )
if __name__ = = "__main__" :
print ( "First Test" )
set1 = [ 'a' , 'b' ]
k = 3
printAllKLength(set1, k)
print ( "\nSecond Test" )
set2 = [ 'a' , 'b' , 'c' , 'd' ]
k = 1
printAllKLength(set2, k)
|
C#
using System;
class GFG {
static void printAllKLength( char [] set , int k)
{
int n = set .Length;
printAllKLengthRec( set , "" , n, k);
}
static void printAllKLengthRec( char [] set ,
String prefix,
int n, int k)
{
if (k == 0)
{
Console.WriteLine(prefix);
return ;
}
for ( int i = 0; i < n; ++i)
{
String newPrefix = prefix + set [i];
printAllKLengthRec( set , newPrefix,
n, k - 1);
}
}
static public void Main ()
{
Console.WriteLine( "First Test" );
char [] set1 = { 'a' , 'b' };
int k = 3;
printAllKLength(set1, k);
Console.WriteLine( "\nSecond Test" );
char [] set2 = { 'a' , 'b' , 'c' , 'd' };
k = 1;
printAllKLength(set2, k);
}
}
|
Javascript
<script>
function printAllKLength(set,k)
{
let n = set.length;
printAllKLengthRec(set, "" , n, k);
}
function printAllKLengthRec(set,prefix,n,k)
{
if (k == 0)
{
document.write(prefix+ "<br>" );
return ;
}
for (let i = 0; i < n; ++i)
{
let newPrefix = prefix + set[i];
printAllKLengthRec(set, newPrefix,
n, k - 1);
}
}
document.write( "First Test<br>" );
let set1=[ 'a' , 'b' ];
let k = 3;
printAllKLength(set1, k);
document.write( "<br>Second Test<br>" );
let set2 = [ 'a' , 'b' , 'c' , 'd' ];
k = 1;
printAllKLength(set2, k);
</script>
|
Output:
First Test
aaa
aab
aba
abb
baa
bab
bba
bbb
Second Test
a
b
c
d
Time complexity: O(nk)
Auxiliary Space: O(k)
The above solution is mainly a generalization of this post.
This article is contributed by Abhinav Ramana. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above