目录链接:
力扣编程题-解法汇总_分享+记录-CSDN博客
GitHub同步刷题项目:
https://github.com/September26/java-algorithms
原题链接:力扣
描述:
给你一个下标从 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
只包含小写英文字母。
解题思路:
* 解题思路: * 首先,求出每个字符出现的次数。 * 然后每个字符的次数都尝试减1,然后统计这个map中的所有value是否一致。
代码:
public class Solution2423 {
Integer first = null;
public boolean equalFrequency(String word) {
Map<Character, Integer> map = new HashMap<>();
for (char c : word.toCharArray()) {
Integer integer = map.getOrDefault(c, 0);
map.put(c, integer + 1);
}
for (char c : map.keySet()) {
int time = map.getOrDefault(c, 0);
if (time == 0) {
continue;
}
first = null;
map.put(c, time - 1);
if (map.values().stream().allMatch(new Predicate<Integer>() {
@Override
public boolean test(Integer integer) {
if (integer == 0) {
return true;
}
if (first == null) {
first = integer;
return true;
}
return integer.equals(first);
}
})) {
return true;
}
map.put(c, time);
}
return false;
}
}