JavaScript Program to Print all Subsequences of a String
A subsequence is a sequence that can be derived from another sequence by deleting zero or more elements without changing the order of the remaining elements. Subsequences of a string can be found with different methods here, we are using the Recursion method, Iteration method and Bit manipulation method.
Example: The example shows the input string and the corresponding output
Input: 'abc' Output: abc ab ac a bc b c
Table of Content
Method 1: Using Recursion
- We can recursively generate subsequences by including or excluding each character in the string.
- Create a function generateSubsequence with two parameters input and output.
- Check input.length==0 by using if condition.
- Here, value of inputString= "abc".
- Then, call the function generateSubsequence.
Example: This example prints all subsequences of a string in JavaScript using the Recursion method.
function generateSubsequence(input, output)
{
// Base Case
if (input.length==0) {
console.log(output);
return;
}
// Include
generateSubsequence(
input.substring(1), output + input[0]);
// Exclude
generateSubsequence(
input.substring(1), output);
}
const inputString = 'abc';
generateSubsequence(inputString,"");
Output
abc ab ac a bc b c
Method 2: Using Iteration
- We can use iterative methods to generate all possible combinations of characters in the string.
- Create a function generateSubsequence with one parameter input.
- Inside the function store the length of the input in variable length. Iterate and check conditions by using for loop and if condition respectively.
- Here, the value of inputString= "abc".
- Then, call the function generateSubsequence with argument inputstring to get output.
Example: This example prints all subsequences of a string in JavaScript using the Iteration method.
function generateSubsequences(input) {
const subsequences = [];
const length = input.length;
for (
let i = 0;
i < 1 << length;
i++
) {
let currentSubsequence = "";
for (
let j = 0;
j < length;
j++
) {
if (i & (1 << j)) {
currentSubsequence +=
input[j];
}
}
subsequences.push(
currentSubsequence
);
}
return subsequences;
}
const inputString = "abc";
const allSubsequences =
generateSubsequences(inputString);
console.log(allSubsequences);
Output
[ '', 'a', 'b', 'ab', 'c', 'ac', 'bc', 'abc' ]
Method 3: Using Bit Manipulation
- We can use bit manipulation to represent the inclusion or exclusion of each character in the subsequence.
- Create a function generateSubsequence with one parameter input.
- Inside the function store the length of the input in variable length. Iterate and check conditions by using for loop and if condition respectively.
- Here,the value of inputString= "abc".
- Then, call the function generateSubsequence with argument inputstring to get output.
Example: This example prints all subsequences of a string in JavaScript using the Bit manipulation method.
function generateSubsequences(input) {
const subsequences = [];
const length = input.length;
for (
let mask = 0;
mask < 1 << length;
mask++
) {
let currentSubsequence = "";
for (
let bit = 0;
bit < length;
bit++
) {
if (mask & (1 << bit)) {
currentSubsequence +=
input[bit];
}
}
subsequences.push(
currentSubsequence
);
}
return subsequences;
}
const inputString = "abc";
const allSubsequences =
generateSubsequences(inputString);
console.log(allSubsequences);
Output
[ '', 'a', 'b', 'ab', 'c', 'ac', 'bc', 'abc' ]
Method 4: Using Queue
Using a queue, iteratively generate subsequences by appending each character to existing subsequences. Initially, the queue contains an empty string. For each character in the string, append it to each string in the queue and enqueue the result.
Example:
function printSubsequences(str) {
const queue = [''];
for (const char of str) {
const size = queue.length;
for (let i = 0; i < size; i++) {
queue.push(queue[i] + char);
}
}
console.log(queue);
}
printSubsequences("abcd");
Output
[ '', 'a', 'b', 'ab', 'c', 'ac', 'bc', 'abc', 'd', 'ad', 'bd', 'abd', 'cd', 'acd', 'bcd', 'abcd' ]