String arrangement
Last updated
Was this helpful?
Last updated
Was this helpful?
class Solution {
class Pair {
int count;
char character;
Pair(int count, char character) {
this.count = count;
this.character = character;
}
}
public String longestDiverseString(int a, int b, int c) {
PriorityQueue<Pair> pq = new PriorityQueue<Pair>((x, y) ->
(y.count - x.count)
);
if (a > 0) pq.offer(new Pair(a, 'a'));
if (b > 0) pq.offer(new Pair(b, 'b'));
if (c > 0) pq.offer(new Pair(c, 'c'));
StringBuilder sb = new StringBuilder();
while (!pq.isEmpty()) {
Pair curt = pq.poll();
int count = curt.count;
char ch = curt.character;
int n = sb.length();
if (sb.length() >= 2 && sb.charAt(n - 1) == ch && sb.charAt(n - 2) == ch) {
if (pq.isEmpty()) break;
Pair temp = pq.poll();
sb.append(temp.character);
if (--temp.count > 0) {
pq.offer(new Pair(temp.count, temp.character));
}
} else {
count--;
sb.append(ch);
}
if (count > 0) pq.offer(new Pair(count, ch));
}
return sb.toString();
}
}
public String longestDiverseString(int a, int b, int c) {
return getString(a, b, c, "a", "b", "c");
}
private String getString(int lg, int me, int sm, String aStr, String bStr, String cStr) {
if (lg < me) {
return getString(me, lg, sm, bStr, aStr, cStr);
}
if (me < sm) {
return getString(lg, sm, me, aStr, cStr, bStr);
}
int aCount = Math.min(2, lg);
int bCount = (lg - aCount >= me) ? 1 : 0;
if (me == 0) {
return aStr.repeat(aCount);
}
String aActualString = aStr.repeat(aCount);
String bActualString = bStr.repeat(bCount);
return aActualString + bActualString + getString(lg - aCount, me - bCount, sm, aStr, bStr, cStr);
}
public String strWithout3a3b(int a, int b) {
return getString(a, b, "a", "b");
}
private String getString(int lg, int sm, String a, String b) {
if (sm > lg) {
return getString(sm, lg, b, a);
}
int aCount = Math.min(lg, 2);
int bCount = (lg - aCount >= sm) ? 1 : 0;
if (sm == 0) {
return a.repeat(aCount);
}
return a.repeat(aCount) + b.repeat(bCount) + getString(lg - aCount, sm - bCount, a, b);
}