反转字符串而不影响特殊字符
给定一个包含特殊字符串和字符('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