LeetCode in Kotlin

2734. Lexicographically Smallest String After Substring Operation

Medium

You are given a string s consisting of only lowercase English letters. In one operation, you can do the following:

Return the lexicographically smallest string you can obtain after performing the above operation exactly once.

A substring is a contiguous sequence of characters in a string.

A string x is lexicographically smaller than a string y of the same length if x[i] comes before y[i] in alphabetic order for the first position i such that x[i] != y[i].

Example 1:

Input: s = “cbabc”

Output: “baabc”

Explanation: We apply the operation on the substring starting at index 0, and ending at index 1 inclusive. It can be proven that the resulting string is the lexicographically smallest.

Example 2:

Input: s = “acbbc”

Output: “abaab”

Explanation: We apply the operation on the substring starting at index 1, and ending at index 4 inclusive. It can be proven that the resulting string is the lexicographically smallest.

Example 3:

Input: s = “leetcode”

Output: “kddsbncd”

Explanation: We apply the operation on the entire string. It can be proven that the resulting string is the lexicographically smallest.

Constraints:

Solution

class Solution {
    fun smallestString(s: String): String {
        var resultArray = CharArray(s.length)
        var found = false
        var i = 0
        while (i < s.length) {
            var c = s[i]
            if (c != 'a' && !found) {
                found = true
                while (i < s.length) {
                    c = s[i]
                    if (c != 'a') {
                        c--
                        resultArray[i] = c
                    } else {
                        i--
                        break
                    }
                    i++
                }
            } else {
                resultArray[i] = c
            }
            i++
        }
        if (!found) {
            resultArray = CharArray(s.length)
            i = 0
            while (i < s.length - 1) {
                resultArray[i] = 'a'
                i++
            }
            resultArray[s.length - 1] = 'z'
        }
        return String(resultArray)
    }
}