LeetCode in Kotlin

2193. Minimum Number of Moves to Make Palindrome

Hard

You are given a string s consisting only of lowercase English letters.

In one move, you can select any two adjacent characters of s and swap them.

Return the minimum number of moves needed to make s a palindrome.

Note that the input will be generated such that s can always be converted to a palindrome.

Example 1:

Input: s = “aabb”

Output: 2

Explanation:

We can obtain two palindromes from s, “abba” and “baab”.

Thus, the minimum number of moves needed to make s a palindrome is 2.

Example 2:

Input: s = “letelt”

Output: 2

Explanation:

One of the palindromes we can obtain from s in 2 moves is “lettel”.

One of the ways we can obtain it is “letelt” -> “letetl” -> “lettel”.

Other palindromes such as “tleelt” can also be obtained in 2 moves.

It can be shown that it is not possible to obtain a palindrome in less than 2 moves.

Constraints:

Solution

class Solution {
    fun minMovesToMakePalindrome(s: String): Int {
        var l = 0
        var r = s.length - 1
        val charArray = s.toCharArray()
        var output = 0
        while (l < r) {
            if (charArray[l] != charArray[r]) {
                val prev = charArray[l]
                var k = r
                while (charArray[k] != prev) {
                    k--
                }
                // middle element
                if (k == l) {
                    val temp = charArray[l]
                    charArray[l] = charArray[l + 1]
                    charArray[l + 1] = temp
                    output++
                    continue
                }
                for (i in k until r) {
                    val temp = charArray[i]
                    charArray[i] = charArray[i + 1]
                    charArray[i + 1] = temp
                    output++
                }
            }
            l++
            r--
        }
        return output
    }
}