LeetCode in Kotlin

2785. Sort Vowels in a String

Medium

Given a 0-indexed string s, permute s to get a new string t such that:

Return the resulting string.

The vowels are 'a', 'e', 'i', 'o', and 'u', and they can appear in lowercase or uppercase. Consonants comprise all letters that are not vowels.

Example 1:

Input: s = “lEetcOde”

Output: “lEOtcede”

Explanation: ‘E’, ‘O’, and ‘e’ are the vowels in s; ‘l’, ‘t’, ‘c’, and ‘d’ are all consonants. The vowels are sorted according to their ASCII values, and the consonants remain in the same places.

Example 2:

Input: s = “lYmpH”

Output: “lYmpH”

Explanation: There are no vowels in s (all characters in s are consonants), so we return “lYmpH”.

Constraints:

Solution

class Solution {
    fun sortVowels(s: String): String {
        val vowelCount = IntArray(11)
        val countIndexMap = IntArray(128)
        val result = s.toCharArray()
        val charMap = "AEIOUaeiou".toCharArray()
        run {
            var i = 0
            while (i < charMap.size) {
                countIndexMap[charMap[i].code] = ++i
            }
        }
        for (c in result) vowelCount[countIndexMap[c.code]]++
        var j = 1
        var i = 0
        while (j < vowelCount.size) {
            if (vowelCount[j] > 0) {
                while (i < result.size) {
                    if (countIndexMap[result[i++].code] == 0) continue
                    vowelCount[j]--
                    result[i - 1] = charMap[j - 1]
                    break
                }
            } else {
                j++
            }
        }
        return String(result)
    }
}