Reverse a string without affecting special characters

Given a string, that contains 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 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 alphabetic character is input string, replace it with current character of temp[].

Efficient Solution:
Time complexity of above solution is O(n), but it requires extra space and it does two traversals of input string.
We can reverse with one traversal and without extra space. Below is 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 above algorithm.



C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to reverse a string 
// with special characters
#include<bits/stdc++.h>
using namespace std;
  
// Returns true if x is an aplhabatic
// 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 spacial
        {
            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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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 panwarabhishek345 

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

def reverseSting(text):
    index = -1
  
    # Loop from last index untill 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right



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

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up

Article Tags :
Practice Tags :


17


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.