License Key Formatting

https://leetcode.com/problems/license-key-formattingEasy

Условие

Дан строковый ключ s, состоящий из цифр, букв и тире. Дефисы разделяют группы символов, а также могут находиться в начале или конце строки. Требуется отформатировать ключ так, чтобы:

• Все буквы были в верхнем регистре.

• Строка была разделена на группы по K символов.

• Первая группа может содержать меньше символов, если это необходимо.

Верни отформатированный ключ.

Примеры

Input: s = “5F3Z-2e-9-w”, k = 4

Output: “5F3Z-2E9W”

Explanation: Группы по 4 символа: “5F3Z”, “2E9W”.
Input: s = “2-5g-3-J”, k = 2

Output: “2-5G-3J”

Explanation: Группы по 2 символа: “2”, “5G”, “3J”.

Решение

fun licenseKeyFormatting(s: String, k: Int): String {
    val sb = StringBuilder()

    // Проходим по строке и добавляем только буквы и цифры в верхнем регистре
    for (char in s) {
        if (char != '-') {
            sb.append(char.uppercaseChar())
        }
    }

    // Начинаем добавлять дефисы с конца, создавая группы по K символов
    var index = sb.length - 1
    val formatted = StringBuilder()

    var count = 0
    while (index >= 0) {
        if (count > 0 && count % k == 0) {
            formatted.append('-')  // Добавляем дефис после каждой группы из K символов
        }
        formatted.append(sb[index])
        count++
        index--
    }

    return formatted.reverse().toString()  // Переворачиваем строку перед возвратом
}

Временная сложность

O(n), где n — длина строки s, так как мы проходим по строке дважды.

Пространственная сложность

O(n), так как результат хранится в StringBuilder.