Reverse a string without affecting special characters
Last Updated :
18 Jan, 2023
Given a string, that contains a special character together with alphabets ('a' to 'z' and 'A' to 'Z'), reverse the string in a way that special characters are not affected.
Examples:
Input: str = "a,b$c"
Output: str = "c,b$a"
Explanation: Note that $ and , are not moved anywhere. Only subsequence "abc" is reversed
Input: str = "Ab,c,de!$"
Output: str = "ed,c,bA!$"
Simple Solution:
- Create a temporary character array say temp[].
- Copy alphabetic characters from the given array to temp[].
- Reverse temp[] using standard string reversal algorithm.
- Now traverse input string and temp in a single loop. Wherever there is an alphabetic character is input string, replace it with the current character of temp[].
Below is the implementation of above approach:
C++
// C++ program to reverse string without
// affecting it's special character
#include <bits/stdc++.h>
using namespace std;
void reverse(string s)
{
// creating character array of size
// equal to length of string
char temp[s.length()];
int x = 0;
for (int i = 0; i < s.length(); i++) {
if (s[i] >= 'a' && s[i] <= 'z'
|| s[i] >= 'A' && s[i] <= 'Z') {
// storing elements in array
temp[x] = s[i];
x++;
}
}
// reversing the character array
reverse(temp, temp + x);
x = 0;
for (int i = 0; i < s.length(); i++) {
if (s[i] >= 'a' && s[i] <= 'z'
|| s[i] >= 'A' && s[i] <= 'Z') {
// updating the original string
s[i] = temp[x];
x++;
}
}
cout << "reversed string is: " << s;
}
// driver code
int main()
{
string s = "Ab,c,de!$";
// function call
reverse(s);
return 0;
}
// this code is contributed by Machhaliya Muhammad
Java
// Java code to illustrate how to reverse a string without
// affecting special characters.
import java.util.*;
class GFG {
public static void rev(char s[], int l, int r)
{
for (int i = l; i < r / 2; i++) {
char temp = s[i];
s[i] = s[r - 1 - i];
s[r - 1 - i] = temp;
}
}
public static void reverse(char s[])
{
// creating character array of size
// equal to length of string
char[] temp = new char[s.length];
int x = 0;
for (int i = 0; i < s.length; i++) {
if (s[i] >= 'a' && s[i] <= 'z'
|| s[i] >= 'A' && s[i] <= 'Z') {
// storing elements in array
temp[x] = s[i];
x++;
}
}
// reversing the character array
rev(temp, 0, x);
x = 0;
for (int i = 0; i < s.length; i++) {
if (s[i] >= 'a' && s[i] <= 'z'
|| s[i] >= 'A' && s[i] <= 'Z') {
// updating the origional string
s[i] = temp[x];
x++;
}
}
String revStr = new String(s);
System.out.println("reversed string is: " + revStr);
}
// Driver Code
public static void main(String[] args)
{
String str = "Ab,c,de!$";
char[] charArray = str.toCharArray();
reverse(charArray);
}
}
// This code is contributed by Aarti_Rathi
Python3
# Python3 program to reverse string without
# affecting it's special character
def rev(s, l, r) :
while l<r :
temp = s[l]
s[l] = s[r]
s[r] = temp
l += 1
r -= 1
# creating character array of size
# equal to length of string
def reverse(s):
temp = ['']*len(s)
x = 0
for i in range(len(s)) :
if s[i] >= 'a' and s[i] <= 'z' or s[i] >= 'A' and s[i] <= 'Z' :
# storing elements in array
temp[x] = s[i]
x += 1
# reversing the character array
rev(temp, 0, x)
lst = list(s)
x = 0
for i in range(len(s)) :
if s[i] >= 'a' and s[i] <= 'z' or s[i] >= 'A' and s[i] <= 'Z' :
# updating the origional string
lst[i] = temp[x]
x += 1
revStr = ""
for i in range(len(s)) :
revStr += lst[i]
print("reverse string is :",revStr);
# Driver Code
if __name__ == "__main__" :
s="Ab,c,de!$"
reverse(s)
# This code is contributed by aditya942003patil
C#
// C# code to illustrate how to reverse an array without
// affecting special characters.
using System;
public class GFG{
public static void rev(char[] s, int l, int r)
{
for (int i = l; i < r / 2; i++) {
char temp = s[i];
s[i] = s[r - 1 - i];
s[r - 1 - i] = temp;
}
}
public static void reverse(char[] s)
{
// creating character array of size
// equal to length of string
char[] temp = new char[s.Length];
int x = 0;
for (int i = 0; i < s.Length; i++) {
if ((s[i] >= 'a' && s[i] <= 'z')
|| (s[i] >= 'A' && s[i] <= 'Z')) {
// storing elements in array
temp[x] = s[i];
x++;
}
}
// reversing the character array
rev(temp,0,x);
x = 0;
for (int i = 0; i < s.Length; i++) {
if (s[i] >= 'a' && s[i] <= 'z'
|| s[i] >= 'A' && s[i] <= 'Z') {
// updating the origional string
s[i] = temp[x];
x++;
}
}
string revStr = new string(s);
Console.WriteLine("reversed string is: " + revStr);
}
// Driver Code
public static void Main(string[] args)
{
string str = "Ab,c,de!$";
char[] charArray = str.ToCharArray();
reverse(charArray);
}
}
// This code is contributed by Srj_27
JavaScript
// Javascript program to reverse string without
// affecting it's special character
function reverse(s)
{
// creating character array of size
// equal to length of string
let temp=new Array(s.length);
let x = 0;
for (let i = 0; i < s.length; i++) {
if (s[i] >= 'a' && s[i] <= 'z'
|| s[i] >= 'A' && s[i] <= 'Z') {
// storing elements in array
temp[x] = s[i];
x++;
}
}
// reversing the character array
//reverse(temp, temp + x);
let str="";
for(let i=x-1; i>=0; i--)
{
str+=temp[i];
}
x = 0;
let ans=""
for (let i = 0; i < s.length; i++) {
if (s[i] >= 'a' && s[i] <= 'z'
|| s[i] >= 'A' && s[i] <= 'Z') {
// updating the original string
ans+= str[x];
x++;
}
else
ans+=s[i];
}
document.write("reversed string is: " + ans);
}
// driver code
let s = "Ab,c,de!$";
// function call
reverse(s);
Outputreversed string is: ed,c,bA!$
Time Complexity: O(N) where N is the length of the string.
Auxiliary Space: O(N) where N is the length of the string.
Efficient Solution:
The time complexity of the above solution is O(n), but it requires extra space, and it does two traversals of an input string.
We can reverse with one traversal and without extra space. Below is the algorithm.
1) Let input string be 'str[]' and length of string be 'n'
2) l = 0, r = n-1
3) While l is smaller than r, do following
a) If str[l] is not an alphabetic character, do l++
b) Else If str[r] is not an alphabetic character, do r--
c) Else swap str[l] and str[r]
Below are implementations of the above algorithm.
C++
// C++ program to reverse a string with special characters
#include <bits/stdc++.h>
using namespace std;
// Returns true if x is an alphabetic character, false
// otherwise
bool isAlphabet(char x)
{
return ((x >= 'A' && x <= 'Z') || (x >= 'a' && x <= 'z'));
}
void reverse(char str[])
{
// Initialize left and right pointers
int r = strlen(str) - 1, l = 0;
// Traverse string from both ends until 'l' and 'r'
while (l < r) {
// Ignore special characters
if (!isAlphabet(str[l]))
l++;
else if (!isAlphabet(str[r]))
r--;
else // Both str[l] and str[r] are not special
{
swap(str[l], str[r]);
l++;
r--;
}
}
}
// Driver code
int main()
{
char str[] = "a!!!b.c.d,e'f,ghi";
cout << "Input string: " << str << endl;
reverse(str);
cout << "Output string: " << str << endl;
return 0;
}
// This code is contributed by Sania Kumari Gupta
C
// C program to reverse a string with special characters
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
// Returns true if x is an alphabetic character, false
// otherwise
bool isAlphabet(char x)
{
return ((x >= 'A' && x <= 'Z') || (x >= 'a' && x <= 'z'));
}
void reverse(char str[])
{
// Initialize left and right pointers
int r = strlen(str) - 1, l = 0;
// Traverse string from both ends until 'l' and 'r'
while (l < r) {
// Ignore special characters
if (!isAlphabet(str[l]))
l++;
else if (!isAlphabet(str[r]))
r--;
// Both str[l] and str[r] are not special
else {
char temp = str[l];
str[l] = str[r];
str[r] = temp;
// swap(str[l], str[r]);
l++;
r--;
}
}
}
// Driver code
int main()
{
char str[] = "a!!!b.c.d,e'f,ghi";
printf("Input string: %s\n", str);
reverse(str);
printf("Output string: %s\n", str);
return 0;
}
// This code is contributed by Sania Kumari Gupta
Java
// Java code to illustrate how to reverse an array without
// affecting special characters.
import java.io.*;
class GFG {
public static void reverse(char str[])
{
// Initialize left and right pointers
int r = str.length - 1, l = 0;
// Traverse string from both ends until 'l' and 'r'
while (l < r) {
// Ignore special characters
if (!Character.isAlphabetic(str[l]))
l++;
else if (!Character.isAlphabetic(str[r]))
r--;
// Both str[l] and str[r] are not spacial
else {
char tmp = str[l];
str[l] = str[r];
str[r] = tmp;
l++;
r--;
}
}
}
// Driver Code
public static void main(String[] args)
{
String str = "a!!!b.c.d,e'f,ghi";
char[] charArray = str.toCharArray();
System.out.println("Input string: " + str);
reverse(charArray);
String revStr = new String(charArray);
System.out.println("Output string: " + revStr);
}
}
// This code is contributed by Sania Kumari Gupta
Python3
def reverseString(text):
index = -1
# Loop from last index until half of the index
for i in range(len(text)-1, int(len(text)/2), -1):
# match character is alphabet or not
if text[i].isalpha():
temp = text[i]
while True:
index += 1
if text[index].isalpha():
text[i] = text[index]
text[index] = temp
break
return text
# Driver code
string = "a!!!b.c.d,e'f,ghi"
print ("Input string: ", string)
string = reverseString(list(string))
print ("Output string: ", "".join(string))
# This code is contributed by shiva9610
C#
// C# code to illustrate how to reverse
// an array without affecting special characters.
using System;
public class GFG
{
public static void reverse(char []str)
{
// Initialize left and right pointers
int r = str.Length - 1, l = 0;
// Traverse string from both ends until
// 'l' and 'r'
while (l < r)
{
// Ignore special characters
if (!char.IsLetter(str[l]))
l++;
else if(!char.IsLetter(str[r]))
r--;
// Both str[l] and str[r] are not spacial
else
{
char tmp = str[l];
str[l] = str[r];
str[r] = tmp;
l++;
r--;
}
}
}
// Driver Code
public static void Main()
{
String str = "a!!!b.c.d,e'f,ghi";
char[] charArray = str.ToCharArray();
Console.WriteLine("Input string: " + str);
reverse(charArray);
String revStr = new String(charArray);
Console.WriteLine("Output string: " + revStr);
}
}
// This code is contributed by PrinciRaj1992
JavaScript
<script>
// JavaScript program to reverse a string
// with special characters
// Returns true if x is an alphabetic
// character, false otherwise
function isAlphabet( x)
{
return ( (x >= 'A' && x <= 'Z') ||
(x >= 'a' && x <= 'z') );
}
function swap(str,a,b)
{
var c="";
for(var i=0;i<str.length;i++)
{
if(i==a)
c= c+ str[b];
else
if(i==b)
c=c+str[a];
else
c=c+str[i];
}
return c;
}
function reverse( str)
{
// Initialize left and right pointers
var r = str.length - 1, l = 0;
// Traverse string from both ends until
// 'l' and 'r'
while (l < r)
{
// Ignore special characters
if (!isAlphabet(str[l]))
l++;
else if(!isAlphabet(str[r]))
r--;
else // Both str[l] and str[r] are not spacial
{
str=swap(str,l, r);
l++;
r--;
}
}
document.write("Output string: "+ str +"<br>");
}
var str= "a!!!b.c.d,e'f,ghi";
document.write( "Input string: " + str +"<br>");
reverse(str);
</script>
OutputInput string: a!!!b.c.d,e'f,ghi
Output string: i!!!h.g.f,e'd,cba
Time Complexity: O(N) where N is the length of the string.
Auxiliary Space: O(1).
Similar Reads
Reverse nodes of a linked list without affecting the special characters
Given a linked list of alphabets and special characters. Reverse the given linked list without affecting the position of the special characters. Examples: Input: g -> @ -> e -> # -> e -> $ -> k -> s -> NULL Output: s -> @ -> k -> # -> e -> $ -> e -> g -
12 min read
Add index to characters and reverse the string
Given a string str, the task is to encrypt and reverse the string. The string is encrypted by adding every character of the string with it's index in the string i.e. if character'a' is at index 2 then the character in the updated string will be 'a' + 2 = 'c'. Since value of string may go beyond 256,
4 min read
Convert characters of a string to opposite case
Given a string, convert the characters of the string into the opposite case,i.e. if a character is the lower case then convert it into upper case and vice-versa. Examples: Input : geeksForgEeksOutput : GEEKSfORGeEKSInput : hello every oneOutput : HELLO EVERY ONEASCII values of alphabets: A - Z = 65
15+ min read
Reverse substrings of given string according to specified array indices
Given string str of length N and an array arr[] of integers, for array element arr[i](1-based indexing), reverse the substring in indices [arr[i], N - arr[i] + 1]. The task is to print the string after every reversal. Examples: Input: str = "GeeksforGeeks", arr[] = {2}Output: GkeeGrofskeesExplanatio
7 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
Check if a string can be rearranged to form special palindrome
Given a string str, the task is to check if it can be rearranged to get a special palindromic string. If we can make it print YES else print NO. A string is called special Palindrome that contains an uppercase and a lower case character of the same character in the palindrome position. Example: ABCc
8 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
String after processing backspace characters
Given a string S containing letters and '#'. The '#" represents a backspace. The task is to print the new string without '#'. Examples: Input : S = "abc#de#f#ghi#jklmn#op#" Output : abdghjklmo Input : S = "##geeks##for##geeks#" Output : geefgeek Approach: A simple approach to this problem by using d
4 min read
Reverse a String | Shell Programming
In shell scripting, reversing a string can be done using various methods, such as rev, awk, sed, and Perl. Here, we provide examples of reversing a string using different approaches and commands in Unix/Linux systems. We are given a string and we have to use shell script to print it in the reverse o
4 min read
Easiest Way to Reverse a String
Have you wondered which is the easiest way to reverse a string, Imagine you are giving a contest and an algorithm you have made requires reversing a string, you must be aware of the easiest way to reverse a string. What is a reversal of string:Reversing a string is the technique that reverses or cha
4 min read