kt: add «1079. Letter Tile Possibilities»

URL:	https://leetcode.com/problems/letter-tile-possibilities/
Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
Matej Focko 2025-02-17 18:50:55 +01:00
parent e2fbb6bd5b
commit c849923112
Signed by: mfocko
SSH key fingerprint: SHA256:icm0fIOSJUpy5+1x23sfr+hLtF9UhY8VpMC7H4WFJP8

View file

@ -0,0 +1,42 @@
class Solution {
private fun factorial(n: Int): Int =
when {
n <= 1 -> 1
else -> (2..n).fold(1) { result, num -> result * num }
}
private fun permutations(seq: String): Int {
val freqs = IntArray(26) { 0 }
for (c in seq.toCharArray()) {
freqs[c - 'A']++
}
return freqs.filter {
it > 1
}.fold(factorial(seq.length)) { total, count ->
total / factorial(count)
}
}
private fun generate(
tiles: String,
seen: MutableSet<String>,
current: String,
i: Int,
): Int =
when {
i >= tiles.length && seen.add(current) -> permutations(current)
i >= tiles.length -> 0
else -> generate(tiles, seen, current, i + 1) + generate(tiles, seen, current + tiles[i], i + 1)
}
fun numTilePossibilities(tiles: String): Int {
val seen = mutableSetOf<String>()
val letters = tiles.toCharArray()
letters.sort()
val sortedTiles = String(letters)
return generate(sortedTiles, seen, "", 0) - 1
}
}