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: 2020-11-17T11:46:48+05:30

710 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements