Rearrange characters in a string such that no two adjacent are same using hashing

24 May, 2022
Given a string str with repeated characters, the task is to rearrange the characters in a string such that no two adjacent characters are same. If it is possible then print Yes else print No.Examples: 
Input: str = “geeksforgeeks” Output: Yes “egeksforegeks” is one such arrangement.
Input: str = “bbbbb” Output: No 
Approach: The idea is to store the frequency of each character in an unordered_map and compare maximum frequency of character with the difference of string length and maximum frequency number. If the maximum frequency is less than the difference then it can be arranged otherwise not.
Let we start putting all the character having maximum frequency alternatively. Then at minimum, we need (max_freq-1) spaces between them to solve the question so that they are not adjacent to each other.But we have  (length of the string – max_freq) spaces left. So, (length of the string – max_freq) should be at least (max_freq-1) to arrange such that no two char are the same.So, it goes this way: (max_freq-1) <= (length of the string – max_freq)  
Let we start putting all the character having maximum frequency alternatively. Then at minimum, we need (max_freq-1) spaces between them to solve the question so that they are not adjacent to each other.
But we have  (length of the string – max_freq) spaces left. So, (length of the string – max_freq) should be at least (max_freq-1) to arrange such that no two char are the same.
So, it goes this way: (max_freq-1) <= (length of the string – max_freq)  
Below is the implementation of the above approach:
C++
Java
Python3
C#
Javascript
// C++ implementation of the approach#include <bits/stdc++.h>#include <time.h>using namespace std; // Function that returns true if it is possible// to rearrange the characters of the string// such that no two consecutive characters are sameint isPossible(string str){     // To store the frequency of    // each of the character    unordered_map<char, int> freq;     // To store the maximum frequency so far    int max_freq = 0;    for (int j = 0; j < (str.length()); j++) {        freq[str[j]]++;        if (freq[str[j]] > max_freq)            max_freq = freq[str[j]];    }     // If possible    if (max_freq <= (str.length() - max_freq + 1))        return true;    return false;} // Driver codeint main(){    string str = "geeksforgeeks";     if (isPossible(str))        cout << "Yes";    else        cout << "No";     return 0;}
// Java implementation of the approachimport java.util.*; class GFG {     // Function that returns true if it is possible    // to rearrange the characters of the string    // such that no two consecutive characters are same    static boolean isPossible(char[] str)    {         // To store the frequency of        // each of the character        Map<Character, Integer> freq = new HashMap<>();         // To store the maximum frequency so far        int max_freq = 0;        for (int j = 0; j < (str.length); j++) {            if (freq.containsKey(str[j])) {                freq.put(str[j], freq.get(str[j]) + 1);                if (freq.get(str[j]) > max_freq)                    max_freq = freq.get(str[j]);            }            else {                freq.put(str[j], 1);                if (freq.get(str[j]) > max_freq)                    max_freq = freq.get(str[j]);            }        }         // If possible        if (max_freq <= (str.length - max_freq + 1))            return true;        return false;    }     // Driver code    public static void main(String[] args)    {        String str = "geeksforgeeks";         if (isPossible(str.toCharArray()))            System.out.println("Yes");        else            System.out.println("No");    }} // This code is contributed by Rajput-Ji
# Python3 implementation of the approach # Function that returns true if it is possible# to rearrange the characters of the String# such that no two consecutive characters are samedef isPossible(Str):     # To store the frequency of    # each of the character    freq = dict()     # To store the maximum frequency so far    max_freq = 0    for j in range(len(Str)):        freq[Str[j]] = freq.get(Str[j], 0) + 1        if (freq[Str[j]] > max_freq):            max_freq = freq[Str[j]]     # If possible    if (max_freq <= (len(Str) - max_freq + 1)):        return True    return False # Driver codeStr = "geeksforgeeks" if (isPossible(Str)):    print("Yes")else:    print("No") # This code is contributed by Mohit Kumar
// C# implementation of the approachusing System;using System.Collections.Generic; class GFG {     // Function that returns true if it is possible    // to rearrange the characters of the string    // such that no two consecutive characters are same    static Boolean isPossible(char[] str)    {         // To store the frequency of        // each of the character        Dictionary<char, int> freq = new Dictionary<char, int>();         // To store the maximum frequency so far        int max_freq = 0;        for (int j = 0; j < (str.Length); j++) {            if (freq.ContainsKey(str[j])) {                var v = freq[str[j]] + 1;                freq.Remove(str[j]);                freq.Add(str[j], v);                if (freq[str[j]] > max_freq)                    max_freq = freq[str[j]];            }            else {                freq.Add(str[j], 1);                if (freq[str[j]] > max_freq)                    max_freq = freq[str[j]];            }        }         // If possible        if (max_freq <= (str.Length - max_freq + 1))            return true;        return false;    }     // Driver code    public static void Main(String[] args)    {        String str = "geeksforgeeks";         if (isPossible(str.ToCharArray()))            Console.WriteLine("Yes");        else            Console.WriteLine("No");    }} // This code is contributed by Princi Singh
<script>     // Javascript implementation of the approach     // Function that returns true if it is possible    // to rearrange the characters of the string    // such that no two consecutive characters are same    function isPossible(str)    {          // To store the frequency of        // each of the character        let freq = new Map();          // To store the maximum frequency so far        let max_freq = 0;        for (let j = 0; j < (str.length); j++) {            if (freq.has(str[j])) {                freq.set(str[j], freq.get(str[j]) + 1);                if (freq.get(str[j]) > max_freq)                    max_freq = freq.get(str[j]);            }            else {                freq.set(str[j], 1);                if (freq.get(str[j]) > max_freq)                    max_freq = freq.get(str[j]);            }        }          // If possible        if (max_freq <= (str.length - max_freq + 1))            return true;        return false;    }         // Driver code          let str = "geeksforgeeks";          if (isPossible(str.split('')))            document.write("Yes");        else           document.write("No"); // This code is contributed by rrrtnx.</script>
Yes
 
Time Complexity: O(N), as we are using a loop to traverse N times.Auxiliary Space: O(26), as we are using frequency map.
mohit kumar 29
Rajput-Ji
princi singh
yogendrasinghranawat
ninja_hattori
sanjoy_62
pankajsharmagfg
rohitsingh07052
Algorithms
C++
Hash
Strings
Hash
Strings
Algorithms
CPP
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
What is Hashing | A Complete Tutorial
Find if there is a path between two vertices in an undirected graph
How to Start Learning DSA?
Complete Roadmap To Learn DSA From Scratch
Types of Complexity Classes | P, NP, CoNP, NP hard and NP complete
Vector in C++ STL
Map in C++ Standard Template Library (STL)
std::sort() in C++ STL
Initialize a vector in C++ (7 different ways)
Bitwise Operators in C/C++