Given two strings string1 and string2, remove those characters from the first string(string1) which are present in the second string(string2). Both strings are different and contain only lowercase characters.
NOTE: The size of the first string is always greater than the size of the second string( |string1| > |string2|).
Example:
Input:
string1 = “computer”
string2 = “cat”
Output: “ompuer”
Explanation: After removing characters(c, a, t)
from string1 we get “ompuer”.
Input:
string1 = “occurrence”
string2 = “car”
Output: “ouene”
Explanation: After removing characters
(c, a, r) from string1 we get “ouene”.
Algorithm: Let the first input string be a ”test string” and the string which has characters to be removed from the first string be a “mask”
- Initialize: res_ind = 0 /* index to keep track of the processing of each character in i/p string */
ip_ind = 0 /* index to keep track of the processing of each character in the resultant string */ - Construct count array from mask_str. The count array would be:
(We can use a Boolean array here instead of an int count array because we don’t need a count, we need to know only if the character is present in a mask string)
count[‘a’] = 1
count[‘k’] = 1
count[‘m’] = 1
count[‘s’] = 1 - Process each character in the input string and if the count of that character is 0, then only add the character to the resultant string.
str = “tet tringng” // ’s’ has been removed because ’s’ was present in mask_str, but we have got two extra characters “ng”
ip_ind = 11
res_ind = 9
Put a ‘\0′ at the end of the string.
Implementations:
C++
#include <bits/stdc++.h>
#define NO_OF_CHAR 256
using namespace std;
int * getcountarray(string str2)
{
int * count = ( int *) calloc ( sizeof ( int ), NO_OF_CHAR);
for ( int i = 0; i < str2.size(); i++)
{
count[str2[i]]++;
}
return count;
}
string removeDirtyChars(string str1, string str2)
{
int * count = getcountarray(str2);
string res;
int ip_idx = 0;
while (ip_idx < str1.size())
{
char temp = str1[ip_idx];
if (count[temp] == 0)
{
res.push_back(temp);
}
ip_idx++;
}
return res;
}
int main()
{
string str1 = "geeksforgeeks" ;
string str2 = "mask" ;
cout << removeDirtyChars(str1, str2) << endl;
}
|
C
#include <stdio.h>
#include <stdlib.h>
#define NO_OF_CHARS 256
int * getCharCountArray( char * str)
{
int * count = ( int *) calloc ( sizeof ( int ), NO_OF_CHARS);
int i;
for (i = 0; *(str + i); i++)
count[*(str + i)]++;
return count;
}
char * removeDirtyChars( char * str, char * mask_str)
{
int * count = getCharCountArray(mask_str);
int ip_ind = 0, res_ind = 0;
while (*(str + ip_ind))
{
char temp = *(str + ip_ind);
if (count[temp] == 0)
{
*(str + res_ind) = *(str + ip_ind);
res_ind++;
}
ip_ind++;
}
*(str + res_ind) = '\0' ;
return str;
}
int main()
{
char str[] = "geeksforgeeks" ;
char mask_str[] = "mask" ;
printf ( "%s" , removeDirtyChars(str, mask_str));
return 0;
}
|
Java
public class GFG {
static final int NO_OF_CHARS = 256 ;
static int [] getCharCountArray(String str)
{
int count[] = new int [NO_OF_CHARS];
for ( int i = 0 ; i < str.length(); i++)
count[str.charAt(i)]++;
return count;
}
static String removeDirtyChars(String str,
String mask_str)
{
int count[] = getCharCountArray(mask_str);
int ip_ind = 0 , res_ind = 0 ;
char arr[] = str.toCharArray();
while (ip_ind != arr.length)
{
char temp = arr[ip_ind];
if (count[temp] == 0 ) {
arr[res_ind] = arr[ip_ind];
res_ind++;
}
ip_ind++;
}
str = new String(arr);
return str.substring( 0 , res_ind);
}
public static void main(String[] args)
{
String str = "geeksforgeeks" ;
String mask_str = "mask" ;
System.out.println(removeDirtyChars(str, mask_str));
}
}
|
Python3
NO_OF_CHARS = 256
def toList(string):
temp = []
for x in string:
temp.append(x)
return temp
def toString( List ):
return ''.join( List )
def getCharCountArray(string):
count = [ 0 ] * NO_OF_CHARS
for i in string:
count[ ord (i)] + = 1
return count
def removeDirtyChars(string, mask_string):
count = getCharCountArray(mask_string)
ip_ind = 0
res_ind = 0
temp = ''
str_list = toList(string)
while ip_ind ! = len (str_list):
temp = str_list[ip_ind]
if count[ ord (temp)] = = 0 :
str_list[res_ind] = str_list[ip_ind]
res_ind + = 1
ip_ind + = 1
return toString(str_list[ 0 :res_ind])
mask_string = "mask"
string = "geeksforgeeks"
print (removeDirtyChars(string, mask_string))
|
C#
using System;
class GFG {
static int NO_OF_CHARS = 256;
static int [] getCharCountArray(String str)
{
int [] count = new int [NO_OF_CHARS];
for ( int i = 0; i < str.Length; i++)
count[str[i]]++;
return count;
}
static String removeDirtyChars(String str,
String mask_str)
{
int [] count = getCharCountArray(mask_str);
int ip_ind = 0, res_ind = 0;
char [] arr = str.ToCharArray();
while (ip_ind != arr.Length)
{
char temp = arr[ip_ind];
if (count[temp] == 0) {
arr[res_ind] = arr[ip_ind];
res_ind++;
}
ip_ind++;
}
str = new String(arr);
return str.Substring(0, res_ind);
}
public static void Main()
{
String str = "geeksforgeeks" ;
String mask_str = "mask" ;
Console.WriteLine(removeDirtyChars(str, mask_str));
}
}
|
Javascript
<script>
let NO_OF_CHARS = 256;
function getcountarray(str2)
{
var count = new Array(NO_OF_CHARS).fill(0);
for ( var i = 0; i < str2.length; i++)
{
count[str2.charCodeAt(i)]++;
}
return count;
}
function removeDirtyChars(str1, str2)
{
var count = getcountarray(str2);
var res = "" ;
var ip_idx = 0;
while (ip_idx < str1.length)
{
var temp = str1[ip_idx];
if (count[temp.charCodeAt(0)] == 0)
{
res = res.concat(temp);
}
ip_idx++;
}
return res;
}
var mask_string = "mask"
var string = "geeksforgeeks"
document.write(removeDirtyChars(string, mask_string));
</script>
|
Time Complexity: O(m+n) Where m is the length of the mask string and n is the length of the input string.
Auxiliary Space: O(m)
An efficient solution is we find every character of string2 in string1 if that character is present then we simply erase that character from string1.
C++
#include <bits/stdc++.h>
using namespace std;
string removeChars(string string1, string string2) {
for ( auto i:string2)
{
while (find(string1.begin(),string1.end(),i)!=string1.end())
{
auto itr = find(string1.begin(),string1.end(),i);
string1.erase(itr);
}
}
return string1;
}
int main()
{
string string1,string2;
string1= "geeksforgeeks" ;
string2= "mask" ;
cout<< removeChars(string1,string2)<<endl;;
return 0;
}
|
C
#include <stdio.h>
#include <string.h>
char * removeChars( char string1[], char string2[]) {
int i, j, k;
int len1 = strlen (string1);
int len2 = strlen (string2);
for (i = 0; i < len2; i++) {
for (j = 0; j < len1; j++) {
if (string1[j] == string2[i]) {
for (k = j; k < len1; k++) {
string1[k] = string1[k + 1];
}
len1--;
j--;
}
}
}
return string1;
}
int main() {
char string1[] = "geeksforgeeks" ;
char string2[] = "mask" ;
printf ( "%s\n" , removeChars(string1, string2));
return 0;
}
|
Java
import java.io.*;
class GFG {
public static String removeChars(String string1,
String string2)
{
for ( int index = 0 ; index < string2.length();
index++) {
char i = string2.charAt(index);
while (string1.contains(i + "" )) {
int itr = string1.indexOf(i);
string1 = string1.replace((i + "" ), "" );
}
}
return string1;
}
public static void main(String[] args)
{
String string1, string2;
string1 = "geeksforgeeks" ;
string2 = "mask" ;
System.out.println(removeChars(string1, string2));
}
}
|
Python3
def removeChars(string1, string2):
for i in string2:
while i in string1:
itr = string1.find(i)
string1 = string1.replace(i, '')
return string1
if __name__ = = "__main__" :
string1 = "geeksforgeeks"
string2 = "mask"
print (removeChars(string1, string2))
|
C#
using System;
public class GFG
{
public static String removeChars(String string1, String string2)
{
for ( int index = 0; index < string2.Length; index++)
{
var i = string2[index];
while (string1.Contains(i.ToString() + "" ))
{
string1 = string1.Replace((i.ToString() + "" ), "" );
}
}
return string1;
}
public static void Main(String[] args)
{
String string1;
String string2;
string1 = "geeksforgeeks" ;
string2 = "mask" ;
Console.WriteLine(GFG.removeChars(string1, string2));
}
}
|
Javascript
function removeChars(string1, string2) {
let i, j, k;
let len1 = string1.length;
let len2 = string2.length;
for (i = 0; i < len2; i++) {
for (j = 0; j < len1; j++) {
if (string1.charAt(j) == string2.charAt(i)) {
string1 = string1.substring(0, j) + string1.substring(j + 1);
len1--;
j--;
}
}
}
return string1;
}
let string1 = "geeksforgeeks" ;
let string2 = "mask" ;
console.log(removeChars(string1, string2));
|
Time Complexity: O(n*m), where n is the size of given string2 and m is the size of string1.
Auxiliary Space: O(1), as no extra space is used
Efficient Solution: An efficient solution is that we can mark the occurrence of all characters present in second string by -1 in frequency character array and then while traversing first string we can ignore the marked characters as shown in below program.
C++
#include <bits/stdc++.h>
using namespace std;
char * removeChars( char * s1, int n1, char * s2, int n2)
{
int arr[26] = { 0 };
int curr = 0;
for ( int i = 0; i < n2; i++)
arr[s2[i] - 'a' ] = -1;
for ( int i = 0; i < n1; i++)
if (arr[s1[i] - 'a' ] != -1) {
s1[curr] = s1[i];
curr++;
}
s1[curr] = '\0' ;
return s1;
}
int main()
{
char string1[] = "geeksforgeeks" ;
char string2[] = "mask" ;
int n1 = sizeof (string1) / sizeof (string1[0]);
int n2 = sizeof (string2) / sizeof (string2[0]);
cout << removeChars(string1, n1, string2, n2) << endl;
return 0;
}
|
C
#include <stdio.h>
#include <string.h>
char * removeChars( char * s1, int n1, char * s2, int n2)
{
int arr[26] = { 0 };
int curr = 0;
for ( int i = 0; i < n2;
i++)
arr[s2[i] - 'a' ]
= -1;
for ( int i = 0; i < n1; i++)
if (arr[s1[i] - 'a' ]
!= -1) {
s1[curr] = s1[i];
curr++;
}
s1[curr] = '\0' ;
return s1;
}
int main()
{
char string1[] = "geeksforgeeks" ;
char string2[] = "mask" ;
int n1 = strlen (string1);
int n2 = strlen (string2);
printf ( "%s\n" , removeChars(string1, n1, string2, n2));
return 0;
}
|
Java
import java.util.*;
public class GFG {
static String removeChars(String s1, int n1, String s2,
int n2)
{
String s3 = "" ;
int [] arr = new int [ 26 ];
for ( int i = 0 ; i < 26 ; i++) {
arr[i] = 0 ;
}
for ( int i = 0 ; i < n2;
i++)
arr[s2.charAt(i) - 'a' ]
= - 1 ;
for ( int i = 0 ; i < n1; i++) {
if (arr[s1.charAt(i) - 'a' ] != - 1 ) {
s3 += s1.charAt(
i);
}
}
s1 = s3;
return s1;
}
public static void main(String args[])
{
String string1 = "geeksforgeeks" ;
String string2 = "mask" ;
int n1 = string1.length();
int n2 = string2.length();
System.out.println(
removeChars(string1, n1, string2, n2));
}
}
|
Python3
def removeChars(s1, n1, s2, n2):
s3 = ""
arr = [ 0 ] * 26
for i in range ( 0 , n2):
arr[ ord (s2[i]) - ord ( 'a' )] = - 1
for i in range ( 0 , n1):
if (arr[ ord (s1[i]) - ord ( 'a' )] ! = - 1 ):
s3 + = s1[i]
s1 = s3
return s1
string1 = "geeksforgeeks"
string2 = "mask"
n1 = len (string1)
n2 = len (string2)
print (removeChars(string1, n1, string2, n2))
|
C#
using System;
class GFG {
static string removeChars( string s1, int n1, string s2,
int n2)
{
string s3 = "" ;
int [] arr = new int [26];
for ( int i = 0; i < 26; i++) {
arr[i] = 0;
}
for ( int i = 0; i < n2;
i++)
arr[s2[i] - 'a' ] = -1;
for ( int i = 0; i < n1; i++) {
if (arr[s1[i] - 'a' ]
!= -1)
{
s3 += s1[i];
}
}
s1 = s3;
return s1;
}
public static void Main()
{
string string1 = "geeksforgeeks" ;
string string2 = "mask" ;
int n1 = string1.Length;
int n2 = string2.Length;
Console.WriteLine(
removeChars(string1, n1, string2, n2));
}
}
|
Javascript
function removeChars(s1, n1, s2, n2) {
let arr = new Array(26).fill(0);
let curr = 0;
for (let i = 0; i < n2; i++) {
arr[s2.charCodeAt(i) - 'a' .charCodeAt(0)] = -1;
}
let output = '' ;
for (let i = 0; i < n1; i++) {
if (arr[s1.charCodeAt(i) - 'a' .charCodeAt(0)] != -1) {
output += s1.charAt(i);
}
}
return output;
}
let string1 = "geeksforgeeks" ;
let string2 = "mask" ;
let n1 = string1.length;
let n2 = string2.length;
console.log(removeChars(string1, n1, string2, n2));
|
Time Complexity: O(|S1|), where |S1| is the size of given string 1.
Auxiliary Space: O(1), as only an array of constant size (26) is used.