Remove extra spaces from a string
Last Updated :
03 Dec, 2023
Given a string containing many consecutive spaces, trim all spaces so that all words should contain only a single space between them. The conversion should be done in-place and solution should handle trailing and leading spaces and also remove preceding spaces before common punctuation like full stop, comma and a question mark.
Examples:
Input:
str = " Hello Geeks . Welcome to GeeksforGeeks . ";
Output:
"Hello Geeks. Welcome to GeeksforGeeks."
Input:
str = "GeeksforGeeks";
Output:
"GeeksforGeeks"
(No change is needed)
This problem is an extension of Remove spaces from a given string
Method 1:
- The idea is to maintain 2 pointers. Initially both point to the beginning of the array.
- The first pointer keeps track of next position to be filled in output string.
- The second pointer is advanced to read all characters of the string one by one.
- On finding any non-space character, the character is copied to the location of the first pointer and then both the first and second pointers are advanced.
- If non-space character is a full stop, comma or a question mark, we also remove any preceding space before it.
- On finding consecutive space characters, one only space is copied to the location of the first pointer and rest are ignored. The leading and trailing spaces are handled separately in the solution.
Below is C++ implementation of above idea.
C++
// C++ program to implement custom trim() function
#include <iostream>
using namespace std;
// Function to in-place trim all spaces in the
// string such that all words should contain only
// a single space between them.
void removeSpaces(string &str)
{
// n is length of the original string
int n = str.length();
// i points to next position to be filled in
// output string/ j points to next character
// in the original string
int i = 0, j = -1;
// flag that sets to true is space is found
bool spaceFound = false;
// Handles leading spaces
while (++j < n && str[j] == ' ');
// read all characters of original string
while (j < n)
{
// if current characters is non-space
if (str[j] != ' ')
{
// remove preceding spaces before dot,
// comma & question mark
if ((str[j] == '.' || str[j] == ',' ||
str[j] == '?') && i - 1 >= 0 &&
str[i - 1] == ' ')
str[i - 1] = str[j++];
else
// copy current character at index i
// and increment both i and j
str[i++] = str[j++];
// set space flag to false when any
// non-space character is found
spaceFound = false;
}
// if current character is a space
else if (str[j++] == ' ')
{
// If space is encountered for the first
// time after a word, put one space in the
// output and set space flag to true
if (!spaceFound)
{
str[i++] = ' ';
spaceFound = true;
}
}
}
// Remove trailing spaces
if (i <= 1)
str.erase(str.begin() + i, str.end());
else
str.erase(str.begin() + i - 1, str.end());
}
// Driver Code
int main()
{
string str = " Hello Geeks . Welcome to"
" GeeksforGeeks . ";
removeSpaces(str);
cout << str;
return 0;
}
Java
class Main{
public static String removeSpaces(String s) {
int n = s.length();
int i = 0, j = -1;
boolean spaceFound = false;
// Handles leading spaces
while (j < n - 1 && s.charAt(j + 1) == ' ') {
j++;
}
// read all characters of original string
while (j < n) {
// if current characters is non-space
if (s.charAt(j) != ' ') {
// remove preceding spaces before dot,
// comma & question mark
if ((s.charAt(j) == '.' || s.charAt(j) == ',' ||
s.charAt(j) == '?') && i - 1 >= 0 &&
s.charAt(i - 1) == ' ') {
s = s.substring(0, i - 1) + s.charAt(j) + s.substring(i);
j++;
} else {
// copy current character at index i
// and increment both i and j
s = s.substring(0, i) + s.charAt(j) + s.substring(i + 1);
i++;
j++;
}
// set space flag to false when any
// non-space character is found
spaceFound = false;
} else if (s.charAt(j) == ' ') {
// If space is encountered for the first
// time after a word, put one space in the
// output and set space flag to true
if (!spaceFound) {
s = s.substring(0, i) + ' ' + s.substring(i + 1);
i++;
spaceFound = true;
}
j++;
}
}
// Remove trailing spaces
if (i <= 1) {
s = s.substring(0, i);
} else {
s = s.substring(0, i - 1);
}
return s;
}
// Driver code
public static void main(String[] args) {
String str = " Hello Geeks . Welcome to"
+ " GeeksforGeeks . ";
str = removeSpaces(str);
System.out.println(str);
}
}
Python3
# Python code for the above approach
def removeSpaces(s):
# n is length of the original string
n = len(s)
# i points to next position to be filled in
# output string/ j points to next character
# in the original string
i = 0
j = -1
# flag that sets to true is space is found
spaceFound = False
# Handles leading spaces
while j < n - 1 and s[j + 1] == ' ':
j += 1
# read all characters of original string
while j < n:
# if current characters is non-space
if s[j] != ' ':
# remove preceding spaces before dot,
# comma & question mark
if ((s[j] == '.' or s[j] == ',' or
s[j] == '?') and i - 1 >= 0 and
s[i - 1] == ' '):
s = s[:i - 1] + s[j] + s[i:]
j += 1
else:
# copy current character at index i
# and increment both i and j
s = s[:i] + s[j] + s[i + 1:]
i += 1
j += 1
# set space flag to false when any
# non-space character is found
spaceFound = False
# if current character is a space
elif s[j] == ' ':
# If space is encountered for the first
# time after a word, put one space in the
# output and set space flag to true
if not spaceFound:
s = s[:i] + ' ' + s[i + 1:]
i += 1
spaceFound = True
j += 1
# Remove trailing spaces
if i <= 1:
s = s[:i]
else:
s = s[:i - 1]
return s
# Driver Code
str = " Hello Geeks . Welcome to" \
" GeeksforGeeks . "
str = removeSpaces(str)
print(str)
# This code is contributed by adityasharmadev01
C#
// C# program to implement custom trim() function
using System;
public class Gfg
{
public static void Main()
{
string str = " Hello Geeks . Welcome to" +
" GeeksforGeeks . ";
removeSpaces(ref str);
Console.WriteLine(str);
}
// Function to in-place trim all spaces in the
// string such that all words should contain only
// a single space between them.
public static void removeSpaces(ref string str)
{
// n is length of the original string
int n = str.Length;
// i points to next position to be filled in
// output string/ j points to next character
// in the original string
int i = 0, j = -1;
// flag that sets to true is space is found
bool spaceFound = false;
// Handles leading spaces
while (++j < n && str[j] == ' ');
// read all characters of original string
while (j < n)
{
// if current characters is non-space
if (str[j] != ' ')
{
// remove preceding spaces before dot,
// comma & question mark
if ((str[j] == '.' || str[j] == ',' ||
str[j] == '?') && i - 1 >= 0 &&
str[i - 1] == ' ')
str = str.Remove(i - 1, 1).Insert(i - 1, str[j++].ToString());
else
{
// copy current character at index i
// and increment both i and j
str = str.Remove(i, 1).Insert(i, str[j++].ToString());
i++;
}
// set space flag to false when any
// non-space character is found
spaceFound = false;
}
// if current character is a space
else if (str[j++] == ' ')
{
// If space is encountered for the first
// time after a word, put one space in the
// output and set space flag to true
if (!spaceFound)
{
str = str.Remove(i, 0).Insert(i, " ");
i++;
spaceFound = true;
}
}
}
// Remove trailing spaces
if (i <= 1)
str = str.Remove(i, n - i);
else
str = str.Remove(i - 1, n - i + 1);
}
}
JavaScript
// JavaScript program to implement custom trim() function
// Function to in-place trim all spaces in the
// string such that all words should contain only
// a single space between them.
function removeSpaces(str) {
// n is length of the original string
let n = str.length;
// i points to next position to be filled in
// output string/ j points to next character
// in the original string
let i = 0, j = -1;
// flag that sets to true is space is found
let spaceFound = false;
// Handles leading spaces
while (++j < n && str[j] == ' ');
// read all characters of original string
while (j < n) {
// if current characters is non-space
if (str[j] != ' ') {
// remove preceding spaces before dot,
// comma & question mark
if ((str[j] == '.' || str[j] == ',' ||
str[j] == '?') && i - 1 >= 0 &&
str[i - 1] == ' ')
str = str.substr(0, i - 1) + str[j++] + str.substr(i);
else
// copy current character at index i
// and increment both i and j
str = str.substr(0, i++) + str[j++] + str.substr(i);
// set space flag to false when any
// non-space character is found
spaceFound = false;
}
// if current character is a space
else if (str[j++] == ' ') {
// If space is encountered for the first
// time after a word, put one space in the
// output and set space flag to true
if (!spaceFound) {
str = str.substr(0, i++) + ' ' + str.substr(i);
spaceFound = true;
}
}
}
// Remove trailing spaces
if (i <= 1)
str = str.substr(0, i);
else
str = str.substr(0, i - 1);
return str;
}
// Driver Code
let str = " Hello Geeks . Welcome to"
+ " GeeksforGeeks . ";
str = removeSpaces(str);
console.log(str);
Output:
Hello Geeks. Welcome to GeeksforGeeks.
Time complexity of above solution is O(n).
Auxiliary Space is O(1) as the conversion is done in-place.
Method 2:
Another solution using predefined functions in Python 3:
C++
#include <iostream>
#include <string>
int main() {
std::string input_string = " Hello Geeks . Welcome , Do you love Geeks , Geeks ? ";
std::string output_string;
bool space_flag = false; // Flag to check if spaces have occurred
for (size_t index = 0; index < input_string.length(); ++index) {
if (input_string[index] != ' ') {
if (space_flag) {
if (input_string[index] == '.' || input_string[index] == '?' || input_string[index] == ',') {
// Do nothing
} else {
output_string += ' ';
}
space_flag = false;
}
output_string += input_string[index];
} else if (index > 0 && input_string[index - 1] != ' ') {
space_flag = true;
}
}
std::cout << output_string << std::endl;
return 0;
}
Java
public class Main {
public static void main(String[] args) {
String inputString = " Hello Geeks . Welcome , Do you love Geeks , Geeks ? ";
String outputString = "";
boolean spaceFlag = false; // Flag to check if spaces have occurred
for (int index = 0; index < inputString.length(); ++index) {
if (inputString.charAt(index) != ' ') {
if (spaceFlag) {
if (inputString.charAt(index) == '.' || inputString.charAt(index) == '?' || inputString.charAt(index) == ',') {
// Do nothing
} else {
outputString += ' ';
}
spaceFlag = false;
}
outputString += inputString.charAt(index);
} else if (index > 0 && inputString.charAt(index - 1) != ' ') {
spaceFlag = true;
}
}
System.out.println(outputString);
}
}
Python3
# Python program to Remove
# extra spaces from a string
input_string = \
' Hello Geeks . Welcome , Do you love Geeks , Geeks ? '
output_string = []
space_flag = False # Flag to check if spaces have occurred
for index in range(len(input_string)):
if input_string[index] != ' ':
if space_flag == True:
if (input_string[index] == '.'
or input_string[index] == '?'
or input_string[index] == ','):
pass
else:
output_string.append(' ')
space_flag = False
output_string.append(input_string[index])
elif input_string[index - 1] != ' ':
space_flag = True
print (''.join(output_string))
C#
using System;
class Program
{
static void Main()
{
string inputString = " Hello Geeks . Welcome to GeeksforGeeks , Do you love Geeks , Geeks ? ";
char[] outputArray = new char[inputString.Length]; // Using char array for efficient string building
int outputIndex = 0;
bool spaceFlag = false; // Flag to check if spaces have occurred
for (int index = 0; index < inputString.Length; ++index)
{
if (inputString[index] != ' ')
{
if (spaceFlag)
{
// Check if the current character is a punctuation mark
if (inputString[index] == '.' || inputString[index] == '?' || inputString[index] == ',')
{
// Do nothing
}
else
{
outputArray[outputIndex++] = ' ';
}
spaceFlag = false;
}
outputArray[outputIndex++] = inputString[index];
}
else if (index > 0 && inputString[index - 1] != ' ')
{
spaceFlag = true;
}
}
string outputString = new string(outputArray, 0, outputIndex); // Convert char array to string
Console.WriteLine(outputString);
}
}
JavaScript
let inputString = " Hello Geeks . Welcome , Do you love Geeks , Geeks ? ";
let outputString = "";
let spaceFlag = false; // Flag to check if spaces have occurred
for (let index = 0; index < inputString.length; ++index) {
if (inputString[index] !== ' ') {
if (spaceFlag) {
if (inputString[index] === '.' || inputString[index] === '?' || inputString[index] === ',') {
// Do nothing
} else {
outputString += ' ';
}
spaceFlag = false;
}
outputString += inputString[index];
} else if (index > 0 && inputString[index - 1] !== ' ') {
spaceFlag = true;
}
}
console.log(outputString);
Output:
Hello Geeks. Welcome to GeeksforGeeks. Do you love Geeks, Geeks?
Time complexity of above solution is O(n).
Auxiliary Space is O(n) as another list had to be created.
Method 3: (Using built-in function)
C++
#include <iostream>
#include <string>
#include <regex>
int main() {
std::string str = " Hello Geeks . Welcome , Do you love Geeks , Geeks ? ";
// Use regular expression to replace multiple spaces with a single space
std::regex pattern("\\s+");
std::string result = std::regex_replace(str, pattern, " ");
// Remove leading and trailing spaces
size_t firstNonSpace = result.find_first_not_of(" ");
size_t lastNonSpace = result.find_last_not_of(" ");
if (firstNonSpace != std::string::npos && lastNonSpace != std::string::npos) {
result = result.substr(firstNonSpace, lastNonSpace - firstNonSpace + 1);
}
std::cout << result << std::endl;
return 0;
}
// code contributed by shinjanpatra
Java
/**
Java Program to remove extra spaces from a string
**/
public class GFG {
public static void main(String args[]) {
String str = " Hello Geeks . Welcome , Do you love Geeks , Geeks ? ";
System.out.println(str.replaceAll("\\s+"," ").trim());
}
}
Python3
# Python program to remove extra spaces from a string
# Input string
str = " Hello Geeks . Welcome , Do you love Geeks , Geeks ? "
# Removing extra spaces using regex
import re
str = re.sub('\s+', ' ', str).strip()
# Printing the final string
print(str)
C#
// C# Program to remove
// extra spaces from a string
using System;
class Program {
static void Main(string[] args)
{
string str
= " Hello Geeks . Welcome , Do you love Geeks , Geeks ? ";
// Removing extra spaces using regex and print
Console.WriteLine(
System.Text.RegularExpressions.Regex.Replace(
str.Trim(), @"\s+", " "));
}
}
JavaScript
<script>
// JavaScript Program to remove
// extra spaces from a string
var str = " Hello Geeks . Welcome , Do you love Geeks , Geeks ? ";
document.write(str.replace("\\s+", " ").trim());
// This code is contributed by rdtank
</script>
Output:
Hello Geeks . Welcome , Do you love Geeks , Geeks ?
Time Complexity: O(n), where n is the number of characters in the string.
Auxiliary Space: O(1), as there are only lowercase letters.
This article is contributed by Aarti_Rathi and Aditya Goel.
Similar Reads
Remove spaces from a given string
Given a string, remove all spaces from the string and return it. Input: "g eeks for ge eeks "Output: "geeksforgeeks"Input: "abc d "Output: "abcd"Expected time complexity is O(n) and only one traversal of string. Below is a Simple Solution 1) Iterate through all characters of given string, do followi
8 min read
Remove duplicates from a string in O(1) extra space
Given a string str of lowercase characters, the task is to remove duplicates and return a resultant string without modifying the order of characters in the original string. Examples: Input: str = "geeksforgeeks" Output: geksfor Input: str = "characters" Output: chartes Approach: The idea is to use b
13 min read
Program to extract words from a given String
The task is to extract words from a given string. There may be one or more space between words. Examples: Input : geeks for geeks Output : geeks for geeks Input : I love coding. Output: I love coding We have discussed a solution in the below post. How to split a string in C/C++, Python and Java? In
3 min read
Removing spaces from a string using Stringstream
Solution to removing spaces from a string is already posted here. In this article another solution using stringstream is discussed. Algorithm: 1. Enter the whole string into stringstream. 2. Empty the string. 3. Extract word by word and concatenate to the string. Program 1: Using EOF. CPP // C++ pro
2 min read
Reverse a string preserving space positions
Given a string s, the task is to reverse the given string while preserving the position of spaces.Examples: Input: "internship at geeks for geeks"Output: skeegrofsk ee gtapi hsn retniExplanation : Reversing the characters without spaces "skeegrofskeegtapihsnretni" and inserting space at original pla
7 min read
Remove consecutive vowels from string
Given a string s of lowercase letters, we need to remove consecutive vowels from the string Note : Sentence should not contain two consecutive vowels ( a, e, i, o, u). Examples : Input: geeks for geeksOutput: geks for geksInput : your article is in queue Output : yor article is in quApproach: Iterat
15+ min read
Python String - removesuffix()
removesuffix() method allows us to remove a specified suffix from a string. This method is particularly helpful when we need to work with strings and remove unwanted endings without manually checking or slicing. For example, we might have a file name that ends with ".txt" and want to remove it to ge
2 min read
Remove all characters other than alphabets from string
Given a string consisting of alphabets and others characters, remove all the characters other than alphabets and print the string so formed. Examples: Input : $Gee*k;s..fo, r'Ge^eks?Output : GeeksforGeeks Input : P&ra+$BHa;;t*ku, ma$r@@s#in}ghOutput : PraBHatkumarsingh Recommended PracticeRemove
12 min read
Print reverse string after removing vowels
Given a string s, print reverse of string and remove the characters from the reversed string where there are vowels in the original string. Examples: Input : geeksforgeeksOutput : segrfsegExplanation :Reversed string is skeegrofskeeg, removing characters from indexes 1, 2, 6, 9 & 10 (0 based ind
13 min read
URLify a given string (Replace spaces with %20)
Given a string s, the task is to replace all the spaces in the string with '%20'.Examples: Input: s = "i love programming"Output: "i%20love%20programming"Explanation: The 2 spaces are replaced by '%20'Input: s = "ab cd"Output: "ab%20cd"Approach:The idea is to iterate through each character of the in
3 min read