diff --git a/java/longest-happy-string.java b/java/longest-happy-string.java new file mode 100644 index 0000000..5a0042a --- /dev/null +++ b/java/longest-happy-string.java @@ -0,0 +1,36 @@ +class Solution { + private char tryAppend(int[] allowed, int[] trailing, char letter) { + int i = letter - 'a'; + + if ((allowed[i] >= allowed[(i + 1) % 3] + && allowed[i] >= allowed[(i + 2) % 3] + && trailing[i] != 2) + || (allowed[i] > 0 && (trailing[(i + 1) % 3] == 2 || trailing[(i + 2) % 3] == 2))) { + --allowed[i]; + ++trailing[i]; + trailing[(i + 1) % 3] = 0; + trailing[(i + 2) % 3] = 0; + return letter; + } + + return '\0'; + } + + public String longestDiverseString(int a, int b, int c) { + var longest = new StringBuilder(); + + var allowed = new int[] {a, b, c}; + var trailing = new int[3]; + for (int i = a + b + c; i > 0; --i) { + for (var letter : new char[] {'a', 'b', 'c'}) { + var toAppend = tryAppend(allowed, trailing, letter); + if (toAppend != '\0') { + longest.append(letter); + break; + } + } + } + + return longest.toString(); + } +}