Minimize count of repositioning of characters to make all given Strings equal
Last Updated :
07 Dec, 2021
Given an array S of strings of size N, the task is to check if it is possible to make all strings equal in any number of operations. In one operation, any character can be removed from the string and inserted at any arbitrary position in the same or different string. If the strings can be made equal, return the minimum number of operations required along with “Yes“, else return “No“.
Examples:
Input: N = 3, S = {aaa, bbb, ccc}
Output: Yes 6
Explanation: All three strings can be made equal to string abc, in minimum 6 operations
- {aaa, bbb, ccc} -> {aa, abbb, ccc}
- {aa, abbb, ccc} -> {a, abbb, accc}
- {a, abbb, accc} -> {ab, abb, accc}
- {ab, abb, accc} -> {ab, ab, abccc}
- {ab, ab, abccc} -> {abc, ab, abcc}
- {abc, ab, abccc} -> {abc, abc, abc}
Input: N = 3, S = {aba, bbb, cda}
Output: No
Approach: The idea to make all the strings equal, can be achieved if the letters should be distributed equally in all the strings. i.e. the frequency of every character should be divisible by N. Follow the steps below to solve the given problem:
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void solve(string S[], int N)
{
vector< int > freq(26, 0);
for ( int i = 0; i < N; i++) {
for ( auto x : S[i]) {
freq[x - 'a' ]++;
}
}
for ( int i = 0; i < 26; i++) {
if (freq[i] % N != 0) {
cout << "No\n" ;
return ;
}
}
for ( int i = 0; i < 26; i++)
freq[i] /= N;
int ans = 0;
for ( int i = 0; i < N; i++) {
vector< int > vis(26, 0);
for ( char c : S[i])
vis++;
for ( int i = 0; i < 26; i++) {
if (freq[i] > 0 && vis[i] > 0) {
ans += abs (freq[i] - vis[i]);
}
}
}
cout << "Yes " << ans << endl;
return ;
}
int main()
{
int N = 3;
string S[N] = { "aaa" , "bbb" , "ccc" };
solve(S, N);
return 0;
}
|
Java
import java.util.*;
class GFG{
static void solve(String S[], int N)
{
int []freq = new int [ 26 ];
for ( int i = 0 ; i < N; i++) {
for ( int x : S[i].toCharArray()) {
freq[x - 'a' ]++;
}
}
for ( int i = 0 ; i < 26 ; i++) {
if (freq[i] % N != 0 ) {
System.out.print( "No\n" );
return ;
}
}
for ( int i = 0 ; i < 26 ; i++)
freq[i] /= N;
int ans = 0 ;
for ( int s = 0 ; s < N; s++) {
int []vis = new int [ 26 ];
for ( char c : S[s].toCharArray())
vis++;
for ( int i = 0 ; i < 26 ; i++) {
if (freq[i] > 0 && vis[i] > 0 ) {
ans += Math.abs(freq[i] - vis[i]);
}
}
}
System.out.print( "Yes " + ans + "\n" );
return ;
}
public static void main(String[] args)
{
int N = 3 ;
String S[] = { "aaa" , "bbb" , "ccc" };
solve(S, N);
}
}
|
Python3
def solve(S, N):
freq = [ 0 for _ in range ( 26 )]
for i in range ( 0 , N):
for x in S[i]:
freq[ ord (x) - ord ( 'a' )] + = 1
for i in range ( 0 , 26 ):
if (freq[i] % N ! = 0 ):
print ( "No" )
return
for i in range ( 0 , 26 ):
freq[i] / / = N
ans = 0
for i in range ( 0 , N):
vis = [ 0 for _ in range ( 26 )]
for c in S[i]:
vis[ ord (c) - ord ( 'a' )] + = 1
for i in range ( 0 , 26 ):
if (freq[i] > 0 and vis[i] > 0 ):
ans + = abs (freq[i] - vis[i])
print (f "Yes {ans}" )
return
if __name__ = = "__main__" :
N = 3
S = [ "aaa" , "bbb" , "ccc" ]
solve(S, N)
|
C#
using System;
class GFG{
static void solve(String []S, int N)
{
int []freq = new int [26];
for ( int i = 0; i < N; i++)
{
foreach ( int x in S[i].ToCharArray())
{
freq[x - 'a' ]++;
}
}
for ( int i = 0; i < 26; i++)
{
if (freq[i] % N != 0)
{
Console.Write( "No\n" );
return ;
}
}
for ( int i = 0; i < 26; i++)
freq[i] /= N;
int ans = 0;
for ( int s = 0; s < N; s++)
{
int []vis = new int [26];
foreach ( char c in S[s].ToCharArray())
vis++;
for ( int i = 0; i < 26; i++)
{
if (freq[i] > 0 && vis[i] > 0)
{
ans += Math.Abs(freq[i] - vis[i]);
}
}
}
Console.Write( "Yes " + ans + "\n" );
return ;
}
public static void Main(String[] args)
{
int N = 3;
String []S = { "aaa" , "bbb" , "ccc" };
solve(S, N);
}
}
|
Javascript
<script>
function solve(S, N)
{
let freq = new Array(26).fill(0);
for (let i = 0; i < N; i++) {
for (x of S[i]) {
freq[x.charCodeAt(0) - 'a' .charCodeAt(0)]++;
}
}
for (let i = 0; i < 26; i++) {
if (freq[i] % N != 0) {
document.write( "No<br>" );
return ;
}
}
for (let i = 0; i < 26; i++)
freq[i] = Math.floor(freq[i] / N);
let ans = 0;
for (let i = 0; i < N; i++) {
let vis = new Array(26).fill(0);
for (c of S[i])
vis++;
for (let i = 0; i < 26; i++) {
if (freq[i] > 0 && vis[i] > 0) {
ans += Math.abs(freq[i] - vis[i]);
}
}
}
document.write( "Yes " + ans);
return ;
}
let N = 3;
let S = [ "aaa" , "bbb" , "ccc" ];
solve(S, N);
</script>
|
Time Complexity: O(N*26)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...