String arrangement

1405. Longest Happy String

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);
}

984. String Without AAA or BBB

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);
}

Last updated

Was this helpful?