Problem Statement: Given two strings, write a program to remove characters from the first string which are present in the second string.
Examples:
Example 1: Input: String str1 = “abcdef” String str2 = “cefz” Output: abd Explanation: The common characters in both strings are c, e, f. So after removing these characters from string 1 we get string resulting string as abd. Example 2: Input: String str1 = “xyzpw” String str2 = “lmno” Output: xyzpw Explanation: As there is no common character in both the strings, string 1 remains unchanged.
Solution
Disclaimer: Don’t jump directly to the solution, try it out yourself first.
Solution 1:
Approach:
Keep on iterating string1(outer for loop) and set the flag to 0
In the inner for loop iterate through string2
If any element of string2 matches the corresponding character of string1 then set the flag to 1
After completion of the inner for loop, if the flag is not equal to 1 i.e if the corresponding string1 character is not present in string2 then add that character to the resulting string.
Return the resulting string after the iteration of loops is completed.
Code:
C++ Code
#include<bits/stdc++.h>
using namespace std;
string solve(string str1, string str2) {
string ans;
for (int i = 0; i < str1.length(); i++) {
int flag = 0;
for (int j = 0; j < str2.length(); j++) {
if (str1[i] == str2[j]) {
flag = 1;
}
}
if (flag != 1)
ans.push_back(str1[i]);
}
return ans;
}
int main() {
// Input string
string str1 = "abcdef";
string str2 = "cefz";
cout << "Final string 1:" << "\n";
cout << solve(str1, str2) << "\n";
return 0;
}
Output:
Final string 1:
abd
Time Complexity: O(m*n), m is the length of string 1, and n is the length of string 2
Space Complexity: O(n) for string ans in C++
Java Code
import java.util.*;
public class rem_char_2_str1 {
public static String solve(String str1, String str2) {
StringBuffer ans = new StringBuffer();
for (int i = 0; i < str1.length(); i++) {
int flag = 0;
for (int j = 0; j < str2.length(); j++) {
if (str1.charAt(i) == str2.charAt(j)) {
flag = 1;
}
}
if (flag != 1)
ans.append(str1.charAt(i));
}
return ans.toString();
}
public static void main(String args[]) {
String str1 = "abcdef";
String str2 = "cefz";
System.out.println("Final string 1:");
System.out.println(solve(str1, str2));
}
}
Output:
Final string 1:
abd
Time Complexity: O(m*n), m is the length of string 1, and n is the length of string 2
Space Complexity: O(n) for StringBuffer in java
Solution 2: Optimized
Approach:
Using HashMap in Java , unordered_map in C++
Hashmap / unordered_map actually helps us to keep the record of string2 characters, which we will eventually compare with string1 characters to find the common characters
Declare the hashmap wherein the keys will be the string2 characters and its corresponding value will be 1.
Now,iterate through string1 and if that character is not present in the HashMap / unordered_map then add that character to the resulting string.
Return the resulting string after the iteration of string1 is over.
Code:
C++ Code
#include<bits/stdc++.h>
using namespace std;
string solve(string str1, string str2) {
unordered_map < char, int > mp;
string ans = "";
for (int i = 0; i < str2.length(); i++) {
mp[str2[i]] = 1;
}
for (int i = 0; i < str1.length(); i++) {
if (!mp[str1[i]]) {
ans.push_back(str1[i]);
}
}
return ans;
}
int main() {
// Input string
string str1 = "abcdef"; // string 1
string str2 = "cefz"; // string 2
cout << "Final string 1:" << "\n";
cout << solve(str1, str2) << "\n";
return 0;
}
Output:
Final string 1:
abd
Time Complexity: O(n)
Space Complexity: O(n) for unordered_map in C++
Java Code
import java.util.*;
public class tUf {
public static String solve(String str1, String str2) {
HashMap < Character, Integer > mp = new HashMap < > ();
StringBuffer ans = new StringBuffer();
for (int i = 0; i < str2.length(); i++) {
mp.put(str2.charAt(i), 1);
}
for (int i = 0; i < str1.length(); i++) {
if (mp.get(str1.charAt(i)) == null)
ans.append(str1.charAt(i));
}
return ans.toString();
}
public static void main(String args[]) {
String str1 = "abcdef"; // string 1
String str2 = "cefz"; // string 2
System.out.println("Final string 1:");
System.out.println(solve(str1, str2));
}
}
Output:
Final string 1:
abd
Time Complexity: O(n)
Space Complexity: O(n) for HashMap in Java
Special thanks to Rishiraj Girmal for contributing to this article on takeUforward. If you also wish to share your knowledge with the takeUforward fam, please check out this article