Least number of manipulations needed to ensure two strings have identical characters
Given two strings return the value of least number of manipulations needed to ensure both strings have identical characters, i.e., both string become anagram of each other.
Examples:
Input : s1 = "aab"
s2 = "aba"
Output : 2
Explanation : string 1 contains 2 a's and 1 b,
also string 2 contains same characters
Input : s1 = "abc"
s2 = "cdd"
Output : 2
Explanation : string 1 contains 1 a, 1 b, 1 c
while string 2 contains 1 c and 2 d's
so there are 2 different characters
Question Source : Yatra.com Interview Experience | Set 7
The idea is to create a extra count array for both the strings separately and then count the difference in characters.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
const int MAX_CHAR = 26;
int leastCount(string s1, string s2, int n)
{
int count1[MAX_CHAR] = { 0 };
int count2[MAX_CHAR] = { 0 };
for ( int i = 0; i < n; i++) {
count1[s1[i] - 'a' ] += 1;
count2[s2[i] - 'a' ] += 1;
}
int res = 0;
for ( int i = 0; i < MAX_CHAR; i++) {
if (count1[i] != 0) {
res += abs (count1[i] - count2[i]);
}
}
return res;
}
int main()
{
string s1 = "abc" ;
string s2 = "cdd" ;
int len = s1.length();
int res = leastCount(s1, s2, len);
cout << res << endl;
return 0;
}
|
Java
import java.io.*;
public class GFG {
static int MAX_CHAR = 26 ;
static int leastCount(String s1,
String s2, int n)
{
int [] count1 = new int [MAX_CHAR];
int [] count2 = new int [MAX_CHAR];
for ( int i = 0 ; i < n; i++)
{
count1[s1.charAt(i) - 'a' ] += 1 ;
count2[s2.charAt(i) - 'a' ] += 1 ;
}
int res = 0 ;
for ( int i = 0 ; i < MAX_CHAR; i++)
{
if (count1[i] != 0 ) {
res += Math.abs(count1[i]
- count2[i]);
}
}
return res;
}
static public void main(String[] args)
{
String s1 = "abc" ;
String s2 = "cdd" ;
int len = s1.length();
int res = leastCount(s1, s2, len);
System.out.println(res);
}
}
|
Python3
MAX_CHAR = 26
def leastCount(s1, s2, n):
count1 = [ 0 ] * MAX_CHAR
count2 = [ 0 ] * MAX_CHAR
for i in range ( n):
count1[ ord (s1[i]) - ord ( 'a' )] + = 1
count2[ ord (s2[i]) - ord ( 'a' )] + = 1
res = 0
for i in range (MAX_CHAR):
if (count1[i] ! = 0 ):
res + = abs (count1[i] - count2[i])
return res
if __name__ = = "__main__" :
s1 = "abc"
s2 = "cdd"
l = len (s1)
res = leastCount(s1, s2, l)
print (res)
|
C#
using System;
public class GFG {
static int MAX_CHAR = 26;
static int leastCount( string s1,
string s2, int n)
{
int [] count1 = new int [MAX_CHAR];
int [] count2 = new int [MAX_CHAR];
for ( int i = 0; i < n; i++)
{
count1[s1[i] - 'a' ] += 1;
count2[s2[i] - 'a' ] += 1;
}
int res = 0;
for ( int i = 0; i < MAX_CHAR; i++)
{
if (count1[i] != 0) {
res += Math.Abs(count1[i]
- count2[i]);
}
}
return res;
}
static public void Main()
{
string s1 = "abc" ;
string s2 = "cdd" ;
int len = s1.Length;
int res = leastCount(s1, s2, len);
Console.WriteLine(res);
}
}
|
Javascript
<script>
let MAX_CHAR = 26;
function leastCount(s1, s2, n)
{
let count1 = new Array(MAX_CHAR);
let count2 = new Array(MAX_CHAR);
for (let i = 0; i < MAX_CHAR; i++)
{
count1[i] = 0;
count2[i] = 0;
}
for (let i = 0; i < n; i++)
{
count1[s1[i].charCodeAt(0) -
'a' .charCodeAt(0)] += 1;
count2[s2[i].charCodeAt(0) -
'a' .charCodeAt(0)] += 1;
}
let res = 0;
for (let i = 0; i < MAX_CHAR; i++)
{
if (count1[i] != 0)
{
res += Math.abs(count1[i] - count2[i]);
}
}
return res;
}
let s1 = "abc" ;
let s2 = "cdd" ;
let len = s1.length;
let res = leastCount(s1, s2, len);
document.write(res);
</script>
|
Last Updated :
18 Jul, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...