Skip to content

Commit 23f5d9d

Browse files
authored
Create 0767-reorganize-string.kt
1 parent d3de30b commit 23f5d9d

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

kotlin/0767-reorganize-string.kt

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
class Solution {
2+
fun reorganizeString(s: String): String {
3+
var count = HashMap<Char, Int>().apply {
4+
for (c in s)
5+
this[c] = getOrDefault(c, 0) + 1
6+
}
7+
8+
val maxHeap = PriorityQueue<Pair<Int, Char>>() { a, b ->
9+
b.first - a.first
10+
}
11+
12+
for ((ch, cnt) in count)
13+
maxHeap.add(cnt to ch)
14+
15+
var prev: Pair<Int, Char>? = null
16+
var res = StringBuilder()
17+
while (maxHeap.isNotEmpty() || prev != null) {
18+
if (maxHeap.isEmpty() && prev != null)
19+
return ""
20+
21+
var (cnt, ch) = maxHeap.poll()
22+
res.append(ch)
23+
cnt--
24+
25+
prev?.let {
26+
maxHeap.add(it)
27+
prev = null
28+
}
29+
30+
if (cnt != 0)
31+
prev = cnt to ch
32+
}
33+
34+
return res.toString()
35+
}
36+
}
37+
38+
// another solution without heap
39+
class Solution {
40+
fun reorganizeString(s: String): String {
41+
val freq = IntArray (26).apply {
42+
for (c in s) this[c - 'a']++
43+
}
44+
45+
var maxFreq = -1
46+
var maxChar = -1
47+
for (letter in 0..25) {
48+
if (freq[letter] > maxFreq) {
49+
maxFreq = freq[letter]
50+
maxChar = letter
51+
}
52+
}
53+
54+
if (maxFreq > (s.length + 1) / 2) return ""
55+
56+
var i = 0
57+
val res = CharArray (s.length).apply {
58+
while (freq[maxChar] > 0) {
59+
this[i] = 'a' + maxChar
60+
i += 2
61+
freq[maxChar]--
62+
}
63+
}
64+
65+
for (letter in 0..25) {
66+
while (freq[letter] > 0) {
67+
if (i > s.lastIndex) i = 1
68+
res[i] = 'a' + letter
69+
i += 2
70+
freq[letter]--
71+
}
72+
}
73+
74+
return res.joinToString("")
75+
}
76+
}

0 commit comments

Comments
 (0)