使用kotlin解决这个问题:2423. 删除字符使频率相同 提示 简单 90 相关企业 给你一个下标从 0 开始的字符串 word ,字符串只包含小写英文字母。你需要选择 一个 下标并 删除 下标处的字符,使得 word 中剩余每个字母出现 频率 相同。 如果删除一个字母后,word 中剩余所有字母的出现频率都相同,那么返回 true ,否则返回 false 。 注意: 字母 x 的 频率 是这个字母在字符串中出现的次数。 你 必须 恰好删除一个字母,不能一个字母都不删除。 示例 1: 输入:word = "abcc" 输出:true 解释:选择下标 3 并删除该字母,word 变成 "abc" 且每个字母出现频率都为 1 。 示例 2: 输入:word = "aazz" 输出:false 解释:我们必须删除一个字母,所以要么 "a" 的频率变为 1 且 "z" 的频率为 2 ,要么两个字母频率反过来。所以不可能让剩余所有字母出现频率相同。 提示: 2 <= word.length <= 100 word 只包含小写英文字母。
时间: 2023-12-06 22:45:28 浏览: 79
一个使用Kotlin打印彩色字符串的库。-Android开发
以下是使用 Kotlin 解决这个问题的代码:
```kotlin
fun canBeEqualFrequency(word: String): Boolean {
val freqMap = mutableMapOf<Char, Int>()
for (char in word) {
freqMap[char] = freqMap.getOrDefault(char, 0) + 1
}
val freqSet = freqMap.values.toSet()
if (freqSet.size == 1) {
return true
}
if (freqSet.size > 2) {
return false
}
val a = freqSet.elementAt(0)
val b = freqSet.elementAt(1)
if (a > b) {
return checkCanDeleteChar(freqMap, a, b)
} else {
return checkCanDeleteChar(freqMap, b, a)
}
}
fun checkCanDeleteChar(freqMap: MutableMap<Char, Int>, moreFreq: Int, lessFreq: Int): Boolean {
var moreCharCount = 0
var lessCharCount = 0
var moreChar: Char? = null
var lessChar: Char? = null
for ((char, freq) in freqMap) {
if (freq == moreFreq) {
moreCharCount++
moreChar = char
} else if (freq == lessFreq) {
lessCharCount++
lessChar = char
} else {
return false
}
if (moreCharCount > 1 || lessCharCount > 1) {
return false
}
}
if (moreCharCount == 1 && lessCharCount == 1) {
return Math.abs(freqMap[moreChar]!! - freqMap[lessChar]!!) == 1
} else {
return true
}
}
```
首先,我们需要统计每个字符在字符串中出现的次数,使用一个 `MutableMap<Char, Int>` 来保存。接着,我们使用一个 `Set<Int>` 来保存所有不同的出现频率,如果 `freqSet.size` 等于 1,说明所有字符都出现了相同的次数,那么剩余所有字符的出现频率也相同,直接返回 true。如果 `freqSet.size` 大于 2,说明无论删除哪个字符都无法让剩余所有字符的出现频率相同,直接返回 false。
接下来,我们需要判断剩余字符出现频率相同的情况。因为只能删除一个字符,所以出现次数多的字符必须至少有一个。我们假设出现次数多的字符出现了 a 次,出现次数少的字符出现了 b 次,如果 a 等于 b,说明所有字符出现次数都相同,直接返回 true。
如果 a 大于 b,我们需要检查是否可以删除出现次数多的字符中的某一个字符,使得剩余所有字符的出现次数相同。我们先遍历一遍 `freqMap`,找到出现次数多的字符和出现次数少的字符,如果有出现次数不是 a 或者 b 的字符,说明不可能让剩余所有字符的出现频率相同,直接返回 false。如果出现次数多的字符和出现次数少的字符都只出现了一次,我们检查删除出现次数多的字符中这个字符后,剩余所有字符的出现次数是否相同。如果相同,返回 true,否则返回 false。如果出现次数多的字符和出现次数少的字符都出现了多次,说明无论删除哪个字符都无法让剩余所有字符的出现频率相同,直接返回 false。
如果 a 小于 b,我们需要检查是否可以删除出现次数少的字符中的某一个字符,使得剩余所有字符的出现次数相同。同样,我们遍历一遍 `freqMap`,找到出现次数多的字符和出现次数少的字符,如果有出现次数不是 a 或者 b 的字符,说明不可能让剩余所有字符的出现频率相同,直接返回 false。如果出现次数多的字符和出现次数少的字符都只出现了一次,我们检查删除出现次数少的字符中这个字符后,剩余所有字符的出现次数是否相同。如果相同,返回 true,否则返回 false。如果出现次数多的字符和出现次数少的字符都出现了多次,说明无论删除哪个字符都无法让剩余所有字符的出现频率相同,直接返回 false。
总之,这个算法的时间复杂度是 O(n),其中 n 是字符串的长度。
阅读全文