Find all Characters in given String which are not present in other String
Last Updated :
05 Apr, 2023
Given two strings str1 and str2, which are of lengths N and M. The second string contains all the characters of the first string, but there are some extra characters as well. The task is to find all the extra characters present in the second string.
Examples:
Input: str1 = “abcd”, str2 = “dabcdehi”
Output: d, e, h, i
Explanation: [d, e, h, i] are the letters that was added in string str2.
‘d’ is included because in str2 there is one extra ‘d’ than in str1.
Input: str1 = “”, str2 = “y”
Output: y
Approach: The solution to this problem is based on the concept of hashing. Follow the steps mentioned below:
- Create an empty hash table of size 26 and increment all occurrences of each character of the first string (str1).
- Now traverse the second string (str2) and remove all characters of first string as well as add the new characters in the hash table.
- Remaining characters in the hash table are the extra characters.
Below is the implementation of the above approach
C++
#include <bits/stdc++.h>
using namespace std;
vector< char > findTheDifference(string str1,
string str2)
{
vector< int > vs(26, 0);
vector< char > ans;
for ( int i = 0; i < str1.size(); i++)
vs[str1[i] - 'a' ]++;
for ( int i = 0; i < str2.size(); i++) {
if (vs[str2[i] - 'a' ] > 0)
vs[str2[i] - 'a' ]--;
else
vs[str2[i] - 'a' ]++;
}
for ( int i = 0; i < 26; i++)
if (vs[i] > 0)
ans.push_back(i + 'a' );
return ans;
}
int main()
{
string str1 = "abcd" ;
string str2 = "dabcdehi" ;
vector< char > ans = findTheDifference(str1, str2);
for ( char c : ans)
cout << c << " " ;
return 0;
}
|
Java
import java.util.*;
class GFG {
public static ArrayList<Character>
findTheDifference(String str1, String str2)
{
ArrayList<Integer> vs = new ArrayList<>();
for ( int i = 0 ; i < 26 ; i++)
vs.add( 0 );
ArrayList<Character> ans = new ArrayList<>();
for ( int i = 0 ; i < str1.length(); i++)
vs.set(str1.charAt(i) - 'a' ,
vs.get(str1.charAt(i) - 'a' ) + 1 );
for ( int i = 0 ; i < str2.length(); i++) {
if (vs.get(str2.charAt(i) - 'a' ) > 0 )
vs.set(str2.charAt(i) - 'a' ,
vs.get(str2.charAt(i) - 'a' ) - 1 );
else
vs.set(str2.charAt(i) - 'a' ,
vs.get(str2.charAt(i) - 'a' ) + 1 );
}
for ( int i = 0 ; i < 26 ; i++)
if (vs.get(i) > 0 ) {
ans.add(( char )(i + 97 ));
}
return ans;
}
public static void main(String[] args)
{
String str1 = "abcd" ;
String str2 = "dabcdehi" ;
ArrayList<Character> ans
= findTheDifference(str1, str2);
for ( int i = 0 ; i < ans.size(); i++) {
System.out.print((ans.get(i)) + " " );
}
}
}
|
Python3
def findTheDifference(str1, str2):
vs = [ 0 for _ in range ( 26 )]
ans = []
for i in range ( 0 , len (str1)):
vs[ ord (str1[i]) - ord ( 'a' )] + = 1
for i in range ( 0 , len (str2)):
if (vs[ ord (str2[i]) - ord ( 'a' )] > 0 ):
vs[ ord (str2[i]) - ord ( 'a' )] - = 1
else :
vs[ ord (str2[i]) - ord ( 'a' )] + = 1
for i in range ( 0 , 26 ):
if (vs[i] > 0 ):
ans.append( chr (i + ord ( 'a' )))
return ans
if __name__ = = "__main__" :
str1 = "abcd"
str2 = "dabcdehi"
ans = findTheDifference(str1, str2)
for c in ans:
print (c, end = " " )
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static char [] findTheDifference( string str1,
string str2)
{
char [] vs = new char [26];
for ( int i = 0; i < 26; i++)
{
vs[i] = '0' ;
}
char [] ans = new char [1000];
for ( int i = 0; i < str1.Length; i++)
vs[str1[i] - 'a' ]++;
for ( int i = 0; i < str2.Length; i++) {
if (vs[str2[i] - 'a' ] > 0)
vs[str2[i] - 'a' ]--;
else
vs[str2[i] - 'a' ]++;
}
for ( int i = 0; i < 26; i++)
if (vs[i] > 0)
string .Concat(ans, i + 'a' );
return ans;
}
public static void Main()
{
string str1 = "abcd" ;
string str2 = "dabcdehi" ;
char [] ans = findTheDifference(str1, str2);
foreach ( char c in ans)
Console.Write(c + " " );
}
}
|
Javascript
<script>
function findTheDifference(str1,
str2) {
let vs = new Array(26).fill(0);
let ans = [];
for (let i = 0; i < str1.length; i++)
vs[str1[i].charCodeAt(0) - 'a' .charCodeAt(0)]++;
for (let i = 0; i < str2.length; i++) {
if (vs[str2[i].charCodeAt(0) - 'a' .charCodeAt(0)] > 0)
vs[str2[i].charCodeAt(0) - 'a' .charCodeAt(0)]--;
else
vs[str2[i].charCodeAt(0) - 'a' .charCodeAt(0)]++;
}
for (let i = 0; i < 26; i++)
if (vs[i] > 0)
ans.push(String.fromCharCode(i + 'a' .charCodeAt(0)));
return ans;
}
let str1 = "abcd" ;
let str2 = "dabcdehi" ;
let ans = findTheDifference(str1, str2);
for (let c of ans)
document.write(c + " " );
</script>
|
Time Complexity: O(M)
Auxiliary Space: O(1).
METHOD: character count” or ” dictionary-based” approach.
The “character count” or “dictionary-based” approach is a method to find the extra characters in one string compared to another string. Here are the steps to implement this approach:
- Create two empty dictionaries count1 and count2.
- Iterate through the characters in the first string str1, and for each character:
a. Check if the character exists in the dictionary count1. If it does, increment its value by 1. If it doesn’t, add the character to the dictionary with a value of 1.
- Repeat step 2 for the second string str2, but using the dictionary count2.
- Create an empty list extra_chars.
- Iterate through the keys in the dictionary count2, and for each key:
a. Check if the key exists in the dictionary count1. If it does, compare the value of the key in both dictionaries. If the value in count2 is greater than the value in count1, append the key to the list extra_chars.
- Return the list extra_chars.
- The find_extra_chars function in the provided code follows these steps and returns a list of extra characters in str2 that are not present in str1.
C++
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>
std::vector< char > find_extra_chars(std::string str1, std::string str2) {
std::unordered_map< char , int > count1, count2;
for ( char c : str1) {
count1++;
}
for ( char c : str2) {
count2++;
}
std::vector< char > extra_chars;
for ( auto pair : count2) {
char c = pair.first;
int count = pair.second;
if (count > count1) {
extra_chars.push_back(c);
}
}
return extra_chars;
}
int main() {
std::string str1 = "abcd" ;
std::string str2 = "dabcdehi" ;
std::vector< char > extra_chars = find_extra_chars(str1, str2);
for ( char c : extra_chars) {
std::cout << c << " " ;
}
std::cout << std::endl;
return 0;
}
|
Java
import java.util.*;
class GFG {
public static List<Character> findExtraChars(String str1, String str2) {
Map<Character, Integer> count1 = new HashMap<>();
Map<Character, Integer> count2 = new HashMap<>();
for ( char c : str1.toCharArray()) {
count1.put(c, count1.getOrDefault(c, 0 ) + 1 );
}
for ( char c : str2.toCharArray()) {
count2.put(c, count2.getOrDefault(c, 0 ) + 1 );
}
List<Character> extraChars = new ArrayList<>();
for ( char c : count2.keySet()) {
if (count2.get(c) > count1.getOrDefault(c, 0 )) {
extraChars.add(c);
}
}
return extraChars;
}
public static void main(String[] args) {
String str1 = "abcd" ;
String str2 = "dabcdehi" ;
List<Character> extraChars = findExtraChars(str1, str2);
System.out.println(extraChars);
}
}
|
Python3
def find_extra_chars(str1, str2):
count1 = {}
count2 = {}
for c in str1:
count1 = count1.get(c, 0 ) + 1
for c in str2:
count2 = count2.get(c, 0 ) + 1
extra_chars = > count1.get(c, 0 )]
return extra_chars
str1 = "abcd"
str2 = "dabcdehi"
extra_chars = find_extra_chars(str1, str2)
print (extra_chars)
|
Javascript
function findExtraChars(str1, str2) {
const count1 = new Map();
const count2 = new Map();
for (const c of str1) {
count1.set(c, (count1.get(c) || 0) + 1);
}
for (const c of str2) {
count2.set(c, (count2.get(c) || 0) + 1);
}
const extraChars = [];
for (const of count2) {
if (!count1.has(c) || count > count1.get(c)) {
extraChars.push(c);
}
}
return extraChars;
}
const str1 = 'abcd' ;
const str2 = 'dabcdehi' ;
const extraChars = findExtraChars(str1, str2);
console.log(extraChars.join( ' ' ));
|
C#
using System;
using System.Collections.Generic;
class Program {
static List< char > FindExtraChars( string str1, string str2)
{
Dictionary< char , int > count1 = new Dictionary< char , int >();
Dictionary< char , int > count2 = new Dictionary< char , int >();
foreach ( char c in str1) {
if (count1.ContainsKey(c)) {
count1++;
}
else {
count1.Add(c, 1);
}
}
foreach ( char c in str2) {
if (count2.ContainsKey(c)) {
count2++;
}
else {
count2.Add(c, 1);
}
}
List< char > extra_chars = new List< char >();
foreach (KeyValuePair< char , int > pair in count2) {
char c = pair.Key;
int count = pair.Value;
if (!count1.ContainsKey(c) || count > count1) {
extra_chars.Add(c);
}
}
return extra_chars;
}
static void Main( string [] args)
{
string str1 = "abcd" ;
string str2 = "dabcdehi" ;
List< char > extra_chars = FindExtraChars(str1, str2);
foreach ( char c in extra_chars) {
Console.Write(c + " " );
}
Console.WriteLine();
}
}
|
Output
['d', 'e', 'h', 'i']
The time complexity of this “dictionary-based” approach is O(n),
The auxiliary space complexity of this approach is O(n).
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...