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++
#include <bits/stdc++.h>
using namespace std;
void reverse(string s)
{
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' ) {
temp[x] = s[i];
x++;
}
}
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' ) {
s[i] = temp[x];
x++;
}
}
cout << "reversed string is: " << s;
}
int main()
{
string s = "Ab,c,de!$" ;
reverse(s);
return 0;
}
|
Java
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[])
{
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' ) {
temp[x] = s[i];
x++;
}
}
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' ) {
s[i] = temp[x];
x++;
}
}
String revStr = new String(s);
System.out.println( "reversed string is: " + revStr);
}
public static void main(String[] args)
{
String str = "Ab,c,de!$" ;
char [] charArray = str.toCharArray();
reverse(charArray);
}
}
|
Python3
def rev(s, l, r) :
while l<r :
temp = s[l]
s[l] = s[r]
s[r] = temp
l + = 1
r - = 1
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' :
temp[x] = s[i]
x + = 1
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' :
lst[i] = temp[x]
x + = 1
revStr = ""
for i in range ( len (s)) :
revStr + = lst[i]
print ( "reverse string is :" ,revStr);
if __name__ = = "__main__" :
s = "Ab,c,de!$"
reverse(s)
|
C#
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)
{
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' )) {
temp[x] = s[i];
x++;
}
}
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' ) {
s[i] = temp[x];
x++;
}
}
string revStr = new string (s);
Console.WriteLine( "reversed string is: " + revStr);
}
public static void Main( string [] args)
{
string str = "Ab,c,de!$" ;
char [] charArray = str.ToCharArray();
reverse(charArray);
}
}
|
Javascript
function reverse(s)
{
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') {
ans+= str[x];
x++;
}
else
ans+=s[i];
}
document.write( "reversed string is: " + ans);
}
let s = "Ab,c,de!$" ;
reverse(s);
|
Output
reversed 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++
#include <bits/stdc++.h>
using namespace std;
bool isAlphabet( char x)
{
return ((x >= 'A' && x <= 'Z' ) || (x >= 'a' && x <= 'z' ));
}
void reverse( char str[])
{
int r = strlen (str) - 1, l = 0;
while (l < r) {
if (!isAlphabet(str[l]))
l++;
else if (!isAlphabet(str[r]))
r--;
else
{
swap(str[l], str[r]);
l++;
r--;
}
}
}
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;
}
|
C
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
bool isAlphabet( char x)
{
return ((x >= 'A' && x <= 'Z' ) || (x >= 'a' && x <= 'z' ));
}
void reverse( char str[])
{
int r = strlen (str) - 1, l = 0;
while (l < r) {
if (!isAlphabet(str[l]))
l++;
else if (!isAlphabet(str[r]))
r--;
else {
char temp = str[l];
str[l] = str[r];
str[r] = temp;
l++;
r--;
}
}
}
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;
}
|
Java
import java.io.*;
class GFG {
public static void reverse( char str[])
{
int r = str.length - 1 , l = 0 ;
while (l < r) {
if (!Character.isAlphabetic(str[l]))
l++;
else if (!Character.isAlphabetic(str[r]))
r--;
else {
char tmp = str[l];
str[l] = str[r];
str[r] = tmp;
l++;
r--;
}
}
}
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);
}
}
|
Python3
def reverseString(text):
index = - 1
for i in range ( len (text) - 1 , int ( len (text) / 2 ), - 1 ):
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
string = "a!!!b.c.d,e'f,ghi"
print ( "Input string: " , string)
string = reverseString( list (string))
print ( "Output string: " , "".join(string))
|
C#
using System;
public class GFG
{
public static void reverse( char []str)
{
int r = str.Length - 1, l = 0;
while (l < r)
{
if (! char .IsLetter(str[l]))
l++;
else if (! char .IsLetter(str[r]))
r--;
else
{
char tmp = str[l];
str[l] = str[r];
str[r] = tmp;
l++;
r--;
}
}
}
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);
}
}
|
Javascript
<script>
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)
{
var r = str.length - 1, l = 0;
while (l < r)
{
if (!isAlphabet(str[l]))
l++;
else if (!isAlphabet(str[r]))
r--;
else
{
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>
|
Output
Input 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).
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...