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++ program to implement the approach #include <bits/stdc++.h> using namespace std;
// Function to find the extra characters vector< char > findTheDifference(string str1,
string str2)
{ vector< int > vs(26, 0);
vector< char > ans;
// Loop to find the frequency
// of characters in str1
for ( int i = 0; i < str1.size(); i++)
vs[str1[i] - 'a' ]++;
// Adjusting frequency in str2
for ( int i = 0; i < str2.size(); i++) {
// If character was present in str1
if (vs[str2[i] - 'a' ] > 0)
vs[str2[i] - 'a' ]--;
else
vs[str2[i] - 'a' ]++;
}
// Loop to find the extra characters
for ( int i = 0; i < 26; i++)
if (vs[i] > 0)
ans.push_back(i + 'a' );
return ans;
} // Driver code int main()
{ // Given string
string str1 = "abcd" ;
string str2 = "dabcdehi" ;
// Function call
vector< char > ans = findTheDifference(str1, str2);
for ( char c : ans)
cout << c << " " ;
return 0;
} |
// Java program to implement the approach import java.util.*;
class GFG {
// Function to find the extra characters
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<>();
// Loop to find the frequency
// of characters in str1
for ( int i = 0 ; i < str1.length(); i++)
vs.set(str1.charAt(i) - 'a' ,
vs.get(str1.charAt(i) - 'a' ) + 1 );
// Adjusting frequency in str2
for ( int i = 0 ; i < str2.length(); i++) {
// If character was present in str1
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 );
}
// Loop to find the extra characters
for ( int i = 0 ; i < 26 ; i++)
if (vs.get(i) > 0 ) {
ans.add(( char )(i + 97 ));
}
return ans;
}
// Driver code
public static void main(String[] args)
{
// Given string
String str1 = "abcd" ;
String str2 = "dabcdehi" ;
// Function call
ArrayList<Character> ans
= findTheDifference(str1, str2);
for ( int i = 0 ; i < ans.size(); i++) {
System.out.print((ans.get(i)) + " " );
}
}
} // This code is contributed by Palak Gupta |
# python3 program to implement the approach # Function to find the extra characters def findTheDifference(str1, str2):
vs = [ 0 for _ in range ( 26 )]
ans = []
# Loop to find the frequency
# of characters in str1
for i in range ( 0 , len (str1)):
vs[ ord (str1[i]) - ord ( 'a' )] + = 1
# Adjusting frequency in str2
for i in range ( 0 , len (str2)):
# If character was present in str1
if (vs[ ord (str2[i]) - ord ( 'a' )] > 0 ):
vs[ ord (str2[i]) - ord ( 'a' )] - = 1
else :
vs[ ord (str2[i]) - ord ( 'a' )] + = 1
# Loop to find the extra characters
for i in range ( 0 , 26 ):
if (vs[i] > 0 ):
ans.append( chr (i + ord ( 'a' )))
return ans
# Driver code if __name__ = = "__main__" :
# Given string
str1 = "abcd"
str2 = "dabcdehi"
# Function call
ans = findTheDifference(str1, str2)
for c in ans:
print (c, end = " " )
# This code is contributed by rakeshsahni
|
// C# program for the above approach using System;
using System.Collections.Generic;
class GFG
{ // Function to find the extra characters
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];
// Loop to find the frequency
// of characters in str1
for ( int i = 0; i < str1.Length; i++)
vs[str1[i] - 'a' ]++;
// Adjusting frequency in str2
for ( int i = 0; i < str2.Length; i++) {
// If character was present in str1
if (vs[str2[i] - 'a' ] > 0)
vs[str2[i] - 'a' ]--;
else
vs[str2[i] - 'a' ]++;
}
// Loop to find the extra characters
for ( int i = 0; i < 26; i++)
if (vs[i] > 0)
string .Concat(ans, i + 'a' );
return ans;
}
// Driver Code
public static void Main()
{
// Given string
string str1 = "abcd" ;
string str2 = "dabcdehi" ;
// Function call
char [] ans = findTheDifference(str1, str2);
foreach ( char c in ans)
Console.Write(c + " " );
}
} // This code is contributed by sanjoy_62. |
<script> // JavaScript code for the above approach
// Function to find the extra characters
function findTheDifference(str1,
str2) {
let vs = new Array(26).fill(0);
let ans = [];
// Loop to find the frequency
// of characters in str1
for (let i = 0; i < str1.length; i++)
vs[str1[i].charCodeAt(0) - 'a' .charCodeAt(0)]++;
// Adjusting frequency in str2
for (let i = 0; i < str2.length; i++) {
// If character was present in str1
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)]++;
}
// Loop to find the extra characters
for (let i = 0; i < 26; i++)
if (vs[i] > 0)
ans.push(String.fromCharCode(i + 'a' .charCodeAt(0)));
return ans;
}
// Driver code
// Given string
let str1 = "abcd" ;
let str2 = "dabcdehi" ;
// Function call
let ans = findTheDifference(str1, str2);
for (let c of ans)
document.write(c + " " );
// This code is contributed by Potta Lokesh
</script>
|
d e h i
d e h i
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.
#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;
// Count occurrences of each character in str1
for ( char c : str1) {
count1++;
}
// Count occurrences of each character in str2
for ( char c : str2) {
count2++;
}
// Find characters that occur in str2 but not in str1
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);
// Print the extra characters found
for ( char c : extra_chars) {
std::cout << c << " " ;
}
std::cout << std::endl;
return 0;
} |
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<>();
// Count occurrences of each character in str1
for ( char c : str1.toCharArray()) {
count1.put(c, count1.getOrDefault(c, 0 ) + 1 );
}
// Count occurrences of each character in str2
for ( char c : str2.toCharArray()) {
count2.put(c, count2.getOrDefault(c, 0 ) + 1 );
}
// Find characters that occur in str2 but not in str1
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); // Output: [d, e, h, i]
}
} // This code is contributed by phasing17 |
def find_extra_chars(str1, str2):
count1 = {}
count2 = {}
# Count occurrences of each character in str1
for c in str1:
count1 = count1.get(c, 0 ) + 1
# Count occurrences of each character in str2
for c in str2:
count2 = count2.get(c, 0 ) + 1
# Find characters that occur in str2 but not in str1
extra_chars = > count1.get(c, 0 )]
return extra_chars
str1 = "abcd"
str2 = "dabcdehi"
extra_chars = find_extra_chars(str1, str2)
print (extra_chars) # Output: ['d', 'e', 'h', 'i']
#This code is contributed by uomkar369 |
function findExtraChars(str1, str2) {
const count1 = new Map();
const count2 = new Map();
// Count occurrences of each character in str1
for (const c of str1) {
count1.set(c, (count1.get(c) || 0) + 1);
}
// Count occurrences of each character in str2
for (const c of str2) {
count2.set(c, (count2.get(c) || 0) + 1);
}
// Find characters that occur in str2 but not in str1
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); // Print the extra characters found console.log(extraChars.join( ' ' ));
|
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 >();
// Count occurrences of each character in str1
foreach ( char c in str1) {
if (count1.ContainsKey(c)) {
count1++;
}
else {
count1.Add(c, 1);
}
}
// Count occurrences of each character in str2
foreach ( char c in str2) {
if (count2.ContainsKey(c)) {
count2++;
}
else {
count2.Add(c, 1);
}
}
// Find characters that occur in str2 but not in str1
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);
// Print the extra characters found
foreach ( char c in extra_chars) {
Console.Write(c + " " );
}
Console.WriteLine();
}
} |
['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).