Longest Happy String in C++


Suppose there is a string. That string is called happy if it does not have any of the strings like 'aaa', 'bbb' or 'ccc' as a substring. If we have three integers like a, b and c, then return any string s, which satisfies the following conditions −

  • s is happy and longest possible.

  • s contains at most an occurrence of the letter 'a', at most b occurrences of the letter 'b' and at most c occurrences of the letter 'c'.

  • s will only contain 'a', 'b' and 'c' letters.

If there is no such string, then return an empty string.

So, if the input is like a = 1, b = 1, c = 7, then the output will be "ccaccbcc"

To solve this, we will follow these steps −

  • Define one data structure where character a, inx and cnt is present

  • Define one priority queue pq, this will prioritize using cnt value of data

  • if a is non-zero, then −

    • insert new Data('a', a, 0) into pq

  • if b is non-zero, then −

    • insert new Data('b', b, 0) into pq

  • if c is non-zero, then −

    • insert new Data('c', c, 0) into pq

  • idx := 1

  • ret := blank string

  • while true is non-zero, do −

    • temp := top element of pq

    • delete element from pq

    • if size of ret is not 0 and last element of ret is same as temp.a, then −

      • if pq is empty, then −

        • Come out from the loop

      • x := temp

      • temp := top element of pq

      • delete element from pq

      • insert x into pq

    • val := 0

    • if not pq is empty and cnt of temp - cnt of first element of pq < 2, then −

      • val := 1

    • Otherwise

      • val := minimum of cnt of temp and 2

    • ret := ret concatenate val from index of temp.a in val to end

    • temp.cnt := temp.cnt - val

    • if pq is empty, then −

      • Come out from the loop

    • temp.idx := idx

    • if temp.cnt > 0, then −

      • insert temp into pq

    • (increase idx by 1)

  • return ret

Example 

Let us see the following implementation to get a better understanding −

 Live Demo

#include <bits/stdc++.h>
using namespace std;
struct Data{
   char a;
   int cnt;
   int idx ;
   Data(char c, int x, int k){
      a = c;
      cnt = x;
      idx = k;
   }
};
struct Cmp{
   bool operator()(Data& a, Data& b) {
      return !(a.cnt>b.cnt);
   }
};
class Solution {
public:
   string longestDiverseString(int a, int b, int c) {
      priority_queue<Data, vector<Data>, Cmp> pq;
      if (a)
         pq.push(Data('a', a, 0));
      if (b)
         pq.push(Data('b', b, 0));
      if (c)
         pq.push(Data('c', c, 0));
      int idx = 1;
         string ret = "";
      while (true) {
         Data temp = pq.top();
         pq.pop();
         if (ret.size() && ret.back() == temp.a) {
            if (pq.empty())
               break;
            Data x = temp;
            temp = pq.top();
            pq.pop();
            pq.push(x);
         }
         int val = 0;
         if (!pq.empty() && temp.cnt - pq.top().cnt < 2) {
            val = 1;
         }
         else
            val = min(temp.cnt, 2);
         ret += string(val, temp.a);
         temp.cnt -= val;
         if (pq.empty())
            break;
         temp.idx = idx;
         if (temp.cnt > 0)
            pq.push(temp);
         idx++;
      }
      return ret;
   }
};
main(){
   Solution ob;
   cout << (ob.longestDiverseString(1,1,7));
}

Input

1,1,7

Output

ccbccacc

Updated on: 17-Nov-2020

488 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements