diff --git a/solution/1400-1499/1405.Longest Happy String/README.md b/solution/1400-1499/1405.Longest Happy String/README.md index 5f80fd4e3b5b3..a13c50aa68f53 100644 --- a/solution/1400-1499/1405.Longest Happy String/README.md +++ b/solution/1400-1499/1405.Longest Happy String/README.md @@ -287,4 +287,76 @@ function longestDiverseString(a: number, b: number, c: number): string { + + +### 方法二:贪心 + 优先队列(另一种写法) + + + +#### TypeScript + +```ts +function longestDiverseString(a: number, b: number, c: number): string { + let res = ''; + let prev = { ch: '', c: 0 }; + let last = { ch: '', c: 0 }; + const pq = new MaxPriorityQueue({ priority: ({ c }) => c }); + + pq.enqueue({ ch: 'a', c: a }); + pq.enqueue({ ch: 'b', c: b }); + pq.enqueue({ ch: 'c', c }); + + while (pq.size()) { + const item = pq.dequeue().element; + let c = item.c < prev.c ? 1 : 2; + + if (prev.c) pq.enqueue(prev); + if (last.ch !== item.ch && item.c) last = { ...item, c: 0 }; + + while (c-- && item.c && last.c++ < 2) { + item.c--; + res += item.ch; + } + prev = item; + } + + return res; +} +``` + +#### JavaScript + +```js +function longestDiverseString(a, b, c) { + let res = ''; + let prev = { ch: '', c: 0 }; + let last = { ch: '', c: 0 }; + const pq = new MaxPriorityQueue({ priority: ({ c }) => c }); + + pq.enqueue({ ch: 'a', c: a }); + pq.enqueue({ ch: 'b', c: b }); + pq.enqueue({ ch: 'c', c }); + + while (pq.size()) { + const item = pq.dequeue().element; + let c = item.c < prev.c ? 1 : 2; + + if (prev.c) pq.enqueue(prev); + if (last.ch !== item.ch && item.c) last = { ...item, c: 0 }; + + while (c-- && item.c && last.c++ < 2) { + item.c--; + res += item.ch; + } + prev = item; + } + + return res; +} +``` + + + + + diff --git a/solution/1400-1499/1405.Longest Happy String/README_EN.md b/solution/1400-1499/1405.Longest Happy String/README_EN.md index bb953d2de5d13..343cbccf73f31 100644 --- a/solution/1400-1499/1405.Longest Happy String/README_EN.md +++ b/solution/1400-1499/1405.Longest Happy String/README_EN.md @@ -284,4 +284,76 @@ function longestDiverseString(a: number, b: number, c: number): string { + + +### Solution 2: Greedy + Priority Queue + + + +#### TypeScript + +```ts +function longestDiverseString(a: number, b: number, c: number): string { + let res = ''; + let prev = { ch: '', c: 0 }; + let last = { ch: '', c: 0 }; + const pq = new MaxPriorityQueue({ priority: ({ c }) => c }); + + pq.enqueue({ ch: 'a', c: a }); + pq.enqueue({ ch: 'b', c: b }); + pq.enqueue({ ch: 'c', c }); + + while (pq.size()) { + const item = pq.dequeue().element; + let c = item.c < prev.c ? 1 : 2; + + if (prev.c) pq.enqueue(prev); + if (last.ch !== item.ch && item.c) last = { ...item, c: 0 }; + + while (c-- && item.c && last.c++ < 2) { + item.c--; + res += item.ch; + } + prev = item; + } + + return res; +} +``` + +#### JavaScript + +```js +function longestDiverseString(a, b, c) { + let res = ''; + let prev = { ch: '', c: 0 }; + let last = { ch: '', c: 0 }; + const pq = new MaxPriorityQueue({ priority: ({ c }) => c }); + + pq.enqueue({ ch: 'a', c: a }); + pq.enqueue({ ch: 'b', c: b }); + pq.enqueue({ ch: 'c', c }); + + while (pq.size()) { + const item = pq.dequeue().element; + let c = item.c < prev.c ? 1 : 2; + + if (prev.c) pq.enqueue(prev); + if (last.ch !== item.ch && item.c) last = { ...item, c: 0 }; + + while (c-- && item.c && last.c++ < 2) { + item.c--; + res += item.ch; + } + prev = item; + } + + return res; +} +``` + + + + + diff --git a/solution/1400-1499/1405.Longest Happy String/Solution2.js b/solution/1400-1499/1405.Longest Happy String/Solution2.js new file mode 100644 index 0000000000000..d97eb4f18028f --- /dev/null +++ b/solution/1400-1499/1405.Longest Happy String/Solution2.js @@ -0,0 +1,26 @@ +function longestDiverseString(a, b, c) { + let res = ''; + let prev = { ch: '', c: 0 }; + let last = { ch: '', c: 0 }; + const pq = new MaxPriorityQueue({ priority: ({ c }) => c }); + + pq.enqueue({ ch: 'a', c: a }); + pq.enqueue({ ch: 'b', c: b }); + pq.enqueue({ ch: 'c', c }); + + while (pq.size()) { + const item = pq.dequeue().element; + let c = item.c < prev.c ? 1 : 2; + + if (prev.c) pq.enqueue(prev); + if (last.ch !== item.ch && item.c) last = { ...item, c: 0 }; + + while (c-- && item.c && last.c++ < 2) { + item.c--; + res += item.ch; + } + prev = item; + } + + return res; +} diff --git a/solution/1400-1499/1405.Longest Happy String/Solution2.ts b/solution/1400-1499/1405.Longest Happy String/Solution2.ts new file mode 100644 index 0000000000000..839194e68f3a8 --- /dev/null +++ b/solution/1400-1499/1405.Longest Happy String/Solution2.ts @@ -0,0 +1,26 @@ +function longestDiverseString(a: number, b: number, c: number): string { + let res = ''; + let prev = { ch: '', c: 0 }; + let last = { ch: '', c: 0 }; + const pq = new MaxPriorityQueue({ priority: ({ c }) => c }); + + pq.enqueue({ ch: 'a', c: a }); + pq.enqueue({ ch: 'b', c: b }); + pq.enqueue({ ch: 'c', c }); + + while (pq.size()) { + const item = pq.dequeue().element; + let c = item.c < prev.c ? 1 : 2; + + if (prev.c) pq.enqueue(prev); + if (last.ch !== item.ch && item.c) last = { ...item, c: 0 }; + + while (c-- && item.c && last.c++ < 2) { + item.c--; + res += item.ch; + } + prev = item; + } + + return res; +}