From 151eb4878b6bf558ae63ee280dcf6e65d0f06707 Mon Sep 17 00:00:00 2001 From: Matej Focko Date: Wed, 16 Oct 2024 23:37:24 +0200 Subject: [PATCH] =?UTF-8?q?java:=20add=20=C2=AB1405.=20Longest=20Happy=20S?= =?UTF-8?q?tring=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit URL: https://leetcode.com/problems/longest-happy-string/ Signed-off-by: Matej Focko --- java/longest-happy-string.java | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 java/longest-happy-string.java 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(); + } +}