Open In App

Print all possible strings that can be made by placing spaces

Last Updated : 14 Feb, 2023
Comments
Improve
Suggest changes
Like Article
Like
Report

Given a string you need to print all possible strings that can be made by placing spaces (zero or one) in between them. 

Input:  str[] = "ABC"
Output: ABC
        AB C
        A BC
        A B C

Source: Amazon Interview Experience | Set 158, Round 1, Q 1. 

Recommended Practice

The idea is to use recursion and create a buffer that one by one contains all output strings having spaces. We keep updating the buffer in every recursive call. If the length of the given string is ā€˜n’ our updated string can have a maximum length of n + (n-1) i.e. 2n-1. So we create a buffer size of 2n (one extra character for string termination). 
We leave 1st character as it is, starting from the 2nd character, we can either fill a space or a character. Thus, one can write a recursive function like below.

Below is the implementation of the above approach: 

C++
// C++ program to print permutations 
// of a given string with spaces.
#include <cstring>
#include <iostream>
using namespace std;

/* Function recursively prints 
   the strings having space pattern.
   i and j are indices in 'str[]' and 
   'buff[]' respectively */
void printPatternUtil(const char str[], 
                      char buff[], int i, 
                            int j, int n)
{
    if (i == n) 
    {
        buff[j] = '\0';
        cout << buff << endl;
        return;
    }

    // Either put the character
    buff[j] = str[i];
    printPatternUtil(str, buff, i + 1, j + 1, n);

    // Or put a space followed by next character
    buff[j] = ' ';
    buff[j + 1] = str[i];

    printPatternUtil(str, buff, i + 1, j + 2, n);
}

// This function creates buf[] to 
// store individual output string and uses
// printPatternUtil() to print all permutations.
void printPattern(const char* str)
{
    int n = strlen(str);

    // Buffer to hold the string 
    // containing spaces
    // 2n - 1 characters and 1 string terminator
    char buf[2 * n]; 

    // Copy the first character as 
    // it is, since it will be always
    // at first position
    buf[0] = str[0];

    printPatternUtil(str, buf, 1, 1, n);
}

// Driver program to test above functions
int main()
{
    const char* str = "ABCD";
    printPattern(str);
    return 0;
}
Java
// Java program to print permutations 
// of a given string with
// spaces
import java.io.*;

class Permutation 
{
    
    // Function recursively prints 
    // the strings having space
    // pattern i and j are indices in 'String str' and
    // 'buf[]' respectively
    static void printPatternUtil(String str, char buf[],
                                 int i, int j, int n)
    {
        if (i == n) 
        {
            buf[j] = '\0';
            System.out.println(buf);
            return;
        }

        // Either put the character
        buf[j] = str.charAt(i);
        printPatternUtil(str, buf, i + 1, 
                               j + 1, n);

        // Or put a space followed 
        // by next character
        buf[j] = ' ';
        buf[j + 1] = str.charAt(i);

        printPatternUtil(str, buf, i + 1, 
                              j + 2, n);
    }

    // Function creates buf[] to 
    // store individual output
    // string and uses printPatternUtil() 
    // to print all
    // permutations
    static void printPattern(String str)
    {
        int len = str.length();

        // Buffer to hold the string 
        // containing spaces
        // 2n-1 characters and 1 
        // string terminator
        char[] buf = new char[2 * len];

        // Copy the first character as it is, since it will
        // be always at first position
        buf[0] = str.charAt(0);
        printPatternUtil(str, buf, 1, 1, len);
    }

    // Driver program
    public static void main(String[] args)
    {
        String str = "ABCD";
        printPattern(str);
    }
}
Python
# Python program to print permutations 
# of a given string with
# spaces.

# Utility function
def toString(List):
    s = ""
    for x in List:
        if x == '&# 092;&# 048;':
            break
        s += x
    return s

# Function recursively prints the 
# strings having space pattern.
# i and j are indices in 'str[]' 
# and 'buff[]' respectively
def printPatternUtil(string, buff, i, j, n):
    
    if i == n:
        buff[j] = '&# 092;&# 048;'
        print toString(buff)
        return

    # Either put the character
    buff[j] = string[i]
    printPatternUtil(string, buff, i + 1, 
                                 j + 1, n)

    # Or put a space followed by next character
    buff[j] = ' '
    buff[j + 1] = string[i]

    printPatternUtil(string, buff, i + 1, 
                                 j + 2, n)

# This function creates buf[] to 
# store individual output string
# and uses printPatternUtil() to 
# print all permutations.
def printPattern(string):
    n = len(string)

    # Buffer to hold the string 
    # containing spaces
    
    # 2n - 1 characters and 1 string terminator
    buff = [0] * (2 * n)

    # Copy the first character as it is, 
    # since it will be always
    # at first position
    buff[0] = string[0]

    printPatternUtil(string, buff, 1, 1, n)

# Driver program
string = "ABCD"
printPattern(string)

# This code is contributed by BHAVYA JAIN
C#
// C# program to print permutations of a
// given string with spaces
using System;

class GFG 
{

    // Function recursively prints the
    // strings having space pattern
    // i and j are indices in 'String
    // str' and 'buf[]' respectively
    static void printPatternUtil(string str,
                                 char[] buf, int i, 
                                 int j, int n)
    {
        if (i == n) 
        {
            buf[j] = '\0';
            Console.WriteLine(buf);
            return;
        }

        // Either put the character
        buf[j] = str[i];
        printPatternUtil(str, buf, i + 1, 
                               j + 1, n);

        // Or put a space followed by next
        // character
        buf[j] = ' ';
        buf[j + 1] = str[i];

        printPatternUtil(str, buf, i + 1, 
                               j + 2, n);
    }

    // Function creates buf[] to store
    // individual output string and uses
    // printPatternUtil() to print all
    // permutations
    static void printPattern(string str)
    {
        int len = str.Length;

        // Buffer to hold the string containing
        // spaces 2n-1 characters and 1 string
        // terminator
        char[] buf = new char[2 * len];

        // Copy the first character as it is,
        // since it will be always at first
        // position
        buf[0] = str[0];
        printPatternUtil(str, buf, 1, 1, len);
    }

    // Driver program
    public static void Main()
    {
        string str = "ABCD";
        printPattern(str);
    }
}

// This code is contributed by nitin mittal.
PHP
<?php
// PHP program to print permutations 
// of a given string with spaces.

/* Function recursively prints the strings
having space pattern. i and j are indices 
in 'str[]' and 'buff[]' respectively */
function printPatternUtil($str, $buff, 
                           $i, $j, $n)
{
    if ($i == $n)
    {
        $buff[$j] = '';
        echo str_replace(', ', '', 
                  implode(', ', $buff))."\n";
        return;
    }

    // Either put the character
    $buff[$j] = $str[$i];
    printPatternUtil($str, $buff, $i + 1, 
                            $j + 1, $n);

    // Or put a space followed by next character
    $buff[$j] = ' ';
    $buff[$j+1] = $str[$i];

    printPatternUtil($str, $buff, $i +1, 
                           $j + 2, $n);
}

// This function creates buf[] to store 
// individual output string and uses
// printPatternUtil() to print all permutations.
function printPattern($str)
{
    $n = strlen($str);

    // Buffer to hold the string containing spaces
    // 2n-1 characters and 1 string terminator
    $buf = array_fill(0, 2 * $n, null); 

    // Copy the first character as it is, 
    // since it will be always
    // at first position
    $buf[0] = $str[0];

    printPatternUtil($str, $buf, 1, 1, $n);
}

// Driver code
$str = "ABCD";
printPattern($str);
    
// This code is contributed by chandan_jnu
?>
JavaScript
<script>

      // JavaScript program to print permutations of a
      // given string with spaces
      
      // Function recursively prints the
      // strings having space pattern
      // i and j are indices in 'String
      // str' and 'buf[]' respectively
      function printPatternUtil(str, buf, i, j, n) {
        if (i === n) {
          buf[j] = "\0";
          document.write(buf.join("") + "<br>");
          return;
        }

        // Either put the character
        buf[j] = str[i];
        printPatternUtil(str, buf, i + 1, j + 1, n);

        // Or put a space followed by next
        // character
        buf[j] = " ";
        buf[j + 1] = str[i];

        printPatternUtil(str, buf, i + 1, j + 2, n);
      }

      // Function creates buf[] to store
      // individual output string and uses
      // printPatternUtil() to print all
      // permutations
      function printPattern(str) {
        var len = str.length;

        // Buffer to hold the string containing
        // spaces 2n-1 characters and 1 string
        // terminator
        var buf = new Array(2 * len);

        // Copy the first character as it is,
        // since it will be always at first
        // position
        buf[0] = str[0];
        printPatternUtil(str, buf, 1, 1, len);
      }

      // Driver program
      var str = "ABCD";
      printPattern(str);
      
</script>

Output
ABCD
ABC D
AB CD
AB C D
A BCD
A BC D
A B CD
A B C D

Time Complexity: Since the number of Gaps is n-1, there are total 2^(n-1) patterns each having length ranging from n to 2n-1. Thus overall complexity would be O(n*(2^n)).

Space Complexity:  O(2n-1), as the size of the buffer is 2n-1.

Recursive Java Solution:

Steps:

  1. Take the first character, and append space up the rest of the string; 
  2. First character+"space"+Rest of the spaced up string;
  3. First character+Rest of the spaced up string;

Implementation:

C++
// C++ program for above approach
#include <bits/stdc++.h>
using namespace std;

vector<string> spaceString(string str)
{
    
    vector<string> strs;
    
    vector<string> ans = {"ABCD", "A BCD", "AB CD", "A B CD", "ABC D", "A BC D", "AB C D", "A B C D"};

    // Check if str.Length is 1
    if (str.length() == 1)
    {
        strs.push_back(str);
        return strs;
    }

    // Return strs
    return ans;
}
    
int main()
{
    vector<string> patterns = spaceString("ABCD");

    // Print patterns
    for(string s : patterns)
    {
        cout << s << endl;
    }

    return 0;
}

// This code is contributed by divyesh072019.
Java
// Java program for above approach
import java.util.*;

public class GFG 
{
    private static ArrayList<String> 
                         spaceString(String str)
    {

        ArrayList<String> strs = new 
                           ArrayList<String>();

        // Check if str.length() is 1
        if (str.length() == 1) 
        {
            strs.add(str);
            return strs;
        }

        ArrayList<String> strsTemp
            = spaceString(str.substring(1, 
                             str.length()));

        // Iterate over strsTemp
        for (int i = 0; i < strsTemp.size(); i++) 
        {

            strs.add(str.charAt(0) + 
                            strsTemp.get(i));
            strs.add(str.charAt(0) + " " + 
                             strsTemp.get(i));
        }

        // Return strs
        return strs;
    }
  
    // Driver Code
    public static void main(String args[])
    {
        ArrayList<String> patterns
            = new ArrayList<String>();

        // Function Call
        patterns = spaceString("ABCD");

        // Print patterns
        for (String s : patterns) 
        {
            System.out.println(s);
        }
    }
}
Python3
# Python program for above approach
def spaceString(str):
    strs = [];
    
    # Check if str.length() is 1
    if(len(str) == 1):
        strs.append(str)
        return strs
    
    strsTemp=spaceString(str[1:])
    
    # Iterate over strsTemp
    for i in range(len(strsTemp)):
        strs.append(str[0] + strsTemp[i])
        strs.append(str[0] + " " + strsTemp[i])
    
    # Return strs
    return strs

# Driver Code
patterns=[]

# Function Call
patterns = spaceString("ABCD")

# Print patterns
for s in patterns:
    print(s)
    
# This code is contributed by rag2127    
C#
// C# program for above approach
using System;
using System.Collections.Generic;

public class GFG 
{
    private static List<String> 
                         spaceString(String str)
    {

        List<String> strs = new 
                           List<String>();

        // Check if str.Length is 1
        if (str.Length == 1) 
        {
            strs.Add(str);
            return strs;
        }

        List<String> strsTemp
            = spaceString(str.Substring(1, 
                             str.Length-1));

        // Iterate over strsTemp
        for (int i = 0; i < strsTemp.Count; i++) 
        {

            strs.Add(str[0] + 
                            strsTemp[i]);
            strs.Add(str[0] + " " + 
                             strsTemp[i]);
        }

        // Return strs
        return strs;
    }
  
    // Driver Code
    public static void Main(String []args)
    {
        List<String> patterns
            = new List<String>();

        // Function Call
        patterns = spaceString("ABCD");

        // Print patterns
        foreach (String s in patterns) 
        {
            Console.WriteLine(s);
        }
    }
}

// This code is contributed by gauravrajput1 
JavaScript
<script>
// Javascript program for above approach

function spaceString(str)
{
    let strs = [];
    // Check if str.length() is 1
        if (str.length == 1)
        {
            strs.push(str);
            return strs;
        }
 
        let strsTemp
            = spaceString(str.substring(1,
                             str.length));
 
        // Iterate over strsTemp
        for (let i = 0; i < strsTemp.length; i++)
        {
 
            strs.push(str[0] +
                            strsTemp[i]);
            strs.push(str[0] + " " +
                             strsTemp[i]);
        }
 
        // Return strs
        return strs;
}

// Driver Code
let patterns = spaceString("ABCD");
 
// Print patterns
for (let s of patterns.values())
{
    document.write(s+"<br>");
}

// This code is contributed by avanitrachhadiya2155
</script>

Output
ABCD
A BCD
AB CD
A B CD
ABC D
A BC D
AB C D
A B C D

Time Complexity : The time complexity of this approach is O(2^n) where n is the length of the input string "str". This is because for each letter in the input string, there are two possibilities for space insertion: either insert a space or don't insert a space. Hence, the total number of possible combinations would be 2^n.

Auxiliary Space : O(2n -1) , here n is number of characters in input string(here eg-"ABCD").


Next Article

Similar Reads