สมมติว่ามีสตริง สตริงนั้นเรียกว่ามีความสุขหากไม่มีสตริงใด ๆ เช่น 'aaa', 'bbb' หรือ 'ccc' เป็นสตริงย่อย หากเรามีจำนวนเต็มสามจำนวน เช่น a, b และ c ให้คืนค่าสตริง s ซึ่งเป็นไปตามเงื่อนไขต่อไปนี้ -
-
มีความสุขและยาวนานที่สุด
-
s มีตัวอักษร 'a' ได้มากที่สุด มากที่สุด b ปรากฏของตัวอักษร 'b' และมากที่สุด c ที่เกิดขึ้นของตัวอักษร 'c'
-
s จะมีเฉพาะตัวอักษร 'a', 'b' และ 'c' เท่านั้น
หากไม่มีสตริงดังกล่าว ให้คืนค่าสตริงว่าง
ดังนั้น หากอินพุตเป็น a =1, b =1, c =7 เอาต์พุตจะเป็น "ccaccbcc"
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดโครงสร้างข้อมูลหนึ่งโครงสร้างที่มีอักขระ a, inx และ cnt
-
กำหนดลำดับความสำคัญของคิว pq ซึ่งจะจัดลำดับความสำคัญโดยใช้ค่า cnt ของข้อมูล
-
ถ้า a ไม่ใช่ศูนย์ แล้ว −
-
แทรกข้อมูลใหม่ ('a', a, 0) ลงใน pq
-
-
ถ้า b ไม่ใช่ศูนย์ ดังนั้น −
-
แทรกข้อมูลใหม่ ('b', b, 0) ลงใน pq
-
-
ถ้า c ไม่ใช่ศูนย์ ดังนั้น −
-
แทรกข้อมูลใหม่ ('c', c, 0) ลงใน pq
-
-
idx :=1
-
ret :=สตริงว่าง
-
ในขณะที่ true ไม่ใช่ศูนย์ ให้ทำ -
-
temp :=องค์ประกอบด้านบนของ pq
-
ลบองค์ประกอบออกจาก pq
-
หากขนาดของ ret ไม่ใช่ 0 และองค์ประกอบสุดท้ายของ ret เหมือนกับ temp.a ดังนั้น −
-
ถ้า pq ว่างเปล่า −
-
ออกจากวง
-
-
x :=อุณหภูมิ
-
temp :=องค์ประกอบด้านบนของ pq
-
ลบองค์ประกอบออกจาก pq
-
แทรก x ลงใน pq
-
-
ค่า :=0
-
ถ้าไม่ใช่ pq ว่างเปล่าและ cnt ของ temp - cnt ขององค์ประกอบแรกของ pq <2 แล้ว -
-
ค่า :=1
-
-
มิฉะนั้น
-
val :=ขั้นต่ำของ cnt ของ temp และ 2
-
-
ret :=ret concatenate val จากดัชนีของ temp.a ใน val ถึงจุดสิ้นสุด
-
temp.cnt :=temp.cnt - วาล
-
ถ้า pq ว่างเปล่า −
-
ออกจากวง
-
-
temp.idx :=idx
-
ถ้า temp.cnt> 0 แล้ว −
-
ใส่อุณหภูมิลงใน pq
-
-
(เพิ่ม idx ขึ้น 1)
-
-
รีเทิร์น
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#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