Decode Algorithms & LeetCode
  • Decode Algorithms & LeetCode
  • G家练习
  • Array
    • Two Sum
    • Two Pointers
    • PrefixSum
    • Matrix
    • Interval & Sweepline
    • Sort
    • Iterator
    • Segment Tree
  • Binary Search
    • 教学
    • Binary Search on Matrix
    • Binary Search To Find An Answer
  • String
    • Parenthesis
    • Sliding Window
    • Trie
    • String arrangement
  • LinkedList
  • Tree
    • Level Order Traversal
    • BST or Inorder
    • Construst Tree
    • Prefix Tree
  • Stack
  • Heap
  • Greedy
  • BFS
  • DFS
    • DFS on String
    • Backtracking
    • DFS+Memo
  • Graph
    • Union Find
    • Topological Sort
    • Dijkstra
    • Bipartite Graph
    • Minimum Spanning Trees (MST)
    • Traveling Salesman Problem (TSP)
  • Dynamic Programing
    • DP on String
    • Knapsack Problem
  • Design
    • Concurrency
  • Math
  • Bit Manipulation
  • Divide & Conquer
Powered by GitBook
On this page

Was this helpful?

  1. String

String arrangement

PreviousTrieNextLinkedList

Last updated 4 days ago

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

1405. Longest Happy String
984. String Without AAA or BBB