📜  反转字符串而不影响特殊字符

📅  最后修改于: 2022-05-13 01:57:08.317000             🧑  作者: Mango

反转字符串而不影响特殊字符

给定一个包含特殊字符串和字符('a' 到 'z' 和 'A' 到 'Z')的字符串,以不影响特殊字符的方式反转字符串。
例子:

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!$"

简单的解决方案:
1) 创建一个临时字符数组,比如 temp[]。
2) 将给定数组中的字母字符复制到 temp[]。
3) 使用标准字符串反转算法反转 temp[]。
4) 现在在一个循环中遍历输入字符串和临时。只要有字母字符就是输入字符串,用 temp[] 的当前字符替换它。
高效解决方案:
上述解决方案的时间复杂度为 O(n),但它需要额外的空间,并且它对输入字符串进行两次遍历。
我们可以通过一次遍历来反转,而无需额外的空间。下面是算法。

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]

以下是上述算法的实现。

C++
// C++ program to reverse a string
// with special characters
#include
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;
}


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 panwarabhishek345


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


输出:

Input string: a!!!b.c.d,e'f,ghi
Output string: i!!!h.g.f,e'd,cba