将 X 替换为 Y 并删除 Z 后查找结果字符串
给定一个字符串str ,任务是用给定的Y替换所有出现的给定X并删除所有出现的给定Z (如果其中没有额外的空间)
例子:
Input: str = “batman”, X = ‘a’, Y = ‘d’, Z = ‘b’
Output: ntdmd
Input: str = “abba”, X = ‘a’, Y = ‘d’, Z = ‘b’
Output: dd
推荐:请先在 {IDE} 上尝试您的方法,然后再继续解决。
方法:
- 这个想法是基于2 个指针。
- 让两个变量start和end指向字符串的开头和结尾。
- 现在,如果开头的字符是 Z,则将其替换为在另一个指向某个位置的指针处没有 Y 的字符> 开始记住,如果找到,则将字符X 替换为 Y。
下面是上述方法的实现:
C++
// C++ program to find the resultant String
// after replacing X with Y and removing Z
#include
using namespace std;
// Function to replace and remove
void replaceRemove(string& s, char X, char Y, char Z)
{
// Two pointer start and end points
// to beginning and end position in the string
int start = 0, end = s.size() - 1;
while (start <= end) {
// If start is having Z
// find X pos in end and
// replace Z with another character
if (s[start] == Z) {
// Find location for having
// different character
// instead of Z
while (end >= 0 && s[end] == Z) {
end--;
}
// If found swap character
// at start and end
if (end > start) {
swap(s[start], s[end]);
if (s[start] == X)
s[start] = Y;
start++;
}
}
// Else increment start
// Also checkin for X
// at start position
else {
if (s[start] == X)
s[start] = Y;
start++;
}
}
while (s.size() > 0 && s[s.size() - 1] == Z) {
s.pop_back();
}
}
// Driver code
int main()
{
string str = "batman";
char X = 'a', Y = 'd', Z = 'b';
replaceRemove(str, X, Y, Z);
if (str.size() == 0) {
cout << -1;
}
else {
cout << str;
}
return 0;
}
Java
// Java program to find the resultant String
// after replacing X with Y and removing Z
class GFG
{
// Function to replace and remove
static String replaceRemove(char []s, char X,
char Y, char Z)
{
// Two pointer start and end points
// to beginning and end position in the string
int start = 0, end = s.length - 1;
while (start <= end)
{
// If start is having Z
// find X pos in end and
// replace Z with another character
if (s[start] == Z)
{
// Find location for having
// different character
// instead of Z
while (end >= 0 && s[end] == Z)
{
end--;
}
char temp ;
// If found swap character
// at start and end
if (end > start)
{
temp = s[start];
s[start] = s[end];
s[end] = temp;
if (s[start] == X)
s[start] = Y;
start++;
}
}
// Else increment start
// Also checkin for X
// at start position
else
{
if (s[start] == X)
s[start] = Y;
start++;
}
}
String new_s = new String(s);
while (new_s.length() > 0 &&
new_s.charAt(new_s.length() - 1) == Z)
{
new_s = new_s.substring(0,new_s.length() - 1);
}
return new_s;
}
// Driver code
public static void main (String[] args)
{
String str = "batman";
char X = 'a', Y = 'd', Z = 'b';
str = replaceRemove(str.toCharArray() , X, Y, Z);
if (str.length() == 0)
{
System.out.println(-1);
}
else
{
System.out.println(str);
}
}
}
// This code is contributed by AnkitRai01
Python3
# Python3 program to find the resultant String
# after replacing X with Y and removing Z
# Function to replace and remove
def replaceRemove(s, X, Y, Z) :
s = list(s);
# Two pointer start and end points
# to beginning and end position in the string
start = 0;
end = len(s) - 1;
while (start <= end) :
# If start is having Z
# find X pos in end and
# replace Z with another character
if (s[start] == Z) :
# Find location for having
# different character
# instead of Z
while (end >= 0 and s[end] == Z) :
end -= 1;
# If found swap character
# at start and end
if (end > start) :
s[start], s[end] = s[end], s[start]
if (s[start] == X):
s[start] = Y;
start += 1
# Else increment start
# Also checkin for X
# at start position
else :
if (s[start] == X) :
s[start] = Y;
start += 1;
while (len(s) > 0 and s[len(s) - 1] == Z):
s.pop();
return "".join(s)
# Driver code
if __name__ == "__main__" :
string = "batman";
X = 'a'; Y = 'd'; Z = 'b';
string = replaceRemove(string, X, Y, Z);
if (len(string) == 0) :
print(-1);
else :
print(string);
# This code is contributed by AnkitRai01
C#
// C# program to find the resultant String
// after replacing X with Y and removing Z
using System;
class GFG
{
// Function to replace and remove
static String replaceRemove(char []s, char X,
char Y, char Z)
{
// Two pointer start and end points
// to beginning and end position in the string
int start = 0, end = s.Length - 1;
while (start <= end)
{
// If start is having Z
// find X pos in end and
// replace Z with another character
if (s[start] == Z)
{
// Find location for having
// different character
// instead of Z
while (end >= 0 && s[end] == Z)
{
end--;
}
char temp ;
// If found swap character
// at start and end
if (end > start)
{
temp = s[start];
s[start] = s[end];
s[end] = temp;
if (s[start] == X)
s[start] = Y;
start++;
}
}
// Else increment start
// Also checkin for X
// at start position
else
{
if (s[start] == X)
s[start] = Y;
start++;
}
}
String new_s = new String(s);
while (new_s.Length > 0 &&
new_s[new_s.Length - 1] == Z)
{
new_s = new_s.Substring(0,new_s.Length - 1);
}
return new_s;
}
// Driver code
public static void Main(String[] args)
{
String str = "batman";
char X = 'a', Y = 'd', Z = 'b';
str = replaceRemove(str.ToCharArray() , X, Y, Z);
if (str.Length == 0)
{
Console.WriteLine(-1);
}
else
{
Console.WriteLine(str);
}
}
}
// This code is contributed by PrinciRaj1992
输出 :
ndtmd