假设有一个字符串。如果该字符串不包含“ aaa”,“ bbb”或“ ccc”之类的任何字符串作为子字符串,则称为“快乐”。如果我们有三个整数,例如a,b和c,则返回满足以下条件的任何字符串s-
s是幸福的,也是最长的。
s最多包含一个字母“ a”的出现,最多包含b个字母“ b”的出现,最多c个字母“ c”的出现。
s仅包含“ a”,“ b”和“ c”字母。
如果没有这样的字符串,则返回一个空字符串。
因此,如果输入像a = 1,b = 1,c = 7,则输出将为“ ccaccbcc”
为了解决这个问题,我们将遵循以下步骤-
定义一个数据结构,其中存在字符a,inx和cnt
定义一个优先级队列pq,它将使用cnt数据值确定优先级
如果a不为零,则-
在pq中插入新的Data('a',a,0)
如果b不为零,则-
在pq中插入新的Data('b',b,0)
如果c不为零,则-
在pq中插入新的Data('c',c,0)
idx:= 1
ret:=空字符串
虽然true为非零,但是-
将温度插入pq
从循环中出来
val:= temp和2的最小值
值:= 1
如果pq为空,则-
x:=温度
temp:= pq的顶部元素
从pq中删除元素
将x插入pq
从循环中出来
temp:= pq的顶部元素
从pq中删除元素
如果ret的大小不为0并且ret的最后一个元素与temp.a相同,则-
值:= 0
如果不是pq为空且temp的cnt-pq的第一个元素的cnt <2,则-
除此以外
ret:= ret从val中temp.a的索引连接val到结束
temp.cnt:= temp.cnt-val
如果pq为空,则-
temp.idx:= idx
如果temp.cnt> 0,则-
(将idx增加1)
返回ret
让我们看下面的实现以更好地理解-
#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)); }
1,1,7
输出结果
ccbccacc