Reverse a string without affecting special characters
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" Note that $ and , are not moved anywhere. Only subsequence "abc" is reversed Input: str = "Ab,c,de!$" Output: str = "ed,c,bA!$"
Simple Solution:
1) Create a temporary character array say temp[].
2) Copy alphabetic characters from the given array to temp[].
3) Reverse temp[] using standard string reversal algorithm.
4) 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[].
Efficient Solution:
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. 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 = reverseSting( 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> |
Output:
Input string: a!!!b.c.d,e'f,ghi Output string: i!!!h.g.f,e'd,cba
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above