LeetCode in Kotlin

2531. Make Number of Distinct Characters Equal

Medium

You are given two 0-indexed strings word1 and word2.

A move consists of choosing two indices i and j such that 0 <= i < word1.length and 0 <= j < word2.length and swapping word1[i] with word2[j].

Return true if it is possible to get the number of distinct characters in word1 and word2 to be equal with exactly one move. Return false otherwise.

Example 1:

Input: word1 = “ac”, word2 = “b”

Output: false

Explanation: Any pair of swaps would yield two distinct characters in the first string, and one in the second string.

Example 2:

Input: word1 = “abcc”, word2 = “aab”

Output: true

Explanation: We swap index 2 of the first string with index 0 of the second string. The resulting strings are word1 = “abac” and word2 = “cab”, which both have 3 distinct characters.

Example 3:

Input: word1 = “abcde”, word2 = “fghij”

Output: true

Explanation: Both resulting strings will have 5 distinct characters, regardless of which indices we swap.

Constraints:

Solution

class Solution {
    fun isItPossible(word1: String, word2: String): Boolean {
        val count1 = count(word1)
        val count2 = count(word2)
        val d = count1[26] - count2[26]
        val zip1 = zip(count1, count2)
        val zip2 = zip(count2, count1)
        for (i in 0..25) {
            val d1 = zip1[i]
            if (d1 == -1) {
                continue
            }
            for (j in 0..25) {
                val d2 = zip2[j]
                if (d2 == -1) {
                    continue
                }
                if (i == j) {
                    if (d == 0) {
                        return true
                    }
                    continue
                }
                if (d - d1 + d2 == 0) {
                    return true
                }
            }
        }
        return false
    }

    private fun zip(c1: IntArray, c2: IntArray): IntArray {
        val zip = IntArray(26)
        for (i in 0..25) {
            var d = 0
            if (c1[i] == 0) {
                d = -1
            } else {
                if (c2[i] == 0) {
                    d++
                }
                if (c1[i] == 1) {
                    d++
                }
            }
            zip[i] = d
        }
        return zip
    }

    private fun count(word: String): IntArray {
        val count = IntArray(27)
        val len = word.length
        for (i in 0 until len) {
            count[word[i].code - 'a'.code]++
        }
        for (i in 0..25) {
            if (count[i] > 0) {
                count[26]++
            }
        }
        return count
    }
}