23.04.29每日一题
题目意思就是字符串中去掉一个字符能满足剩下字符出现频率一样就返回true.
我的思路
-
统计字符串中每个字符出现的次数
-
然后统计出现的频率次数对应以及该出现该频率的字符数
-
分类什么情况可以满足要求如果统计出现频率次数于无论怎么删除都没有用,所以值考虑 1,2
- 假设统计次数为1,那么要么出现频率为1(例如abcde,删除任意一个都瞒满足要求),要么字符数为1(例如aaaaaa,删除一个也满足要求)
- 加入统计次数为2,要么其中有一个满足统计频率为1,且次数为1,那么删除这个字符,其他字符出现频率就一样了,还有一种就是其中一个频率比另一个频率多一个,且次数为1,那么只需要将这个字符删除一个,那么他出现的频率就和剩下字符一样了,也能够满足要求。
class Solution {
public boolean equalFrequency(String word) {
int[] ct=new int[26];
for(char c:word.toCharArray()){
ct[c-'a']++;
}
HashMap<Integer,Integer> map=new HashMap<>();
for(int x:ct){
if(x==0) continue;
map.put(x,map.getOrDefault(x,0)+1);
}
if(map.size()>2){
return false;
}
if(map.size()==2){
int k1=0,k2=0,v1=0,v2=0;
for(int x:map.keySet()){
if(k1==0){
k1=x;
v1=map.get(x);
}else{
k2=x;
v2=map.get(x);
}
}
if(v1==1&&k1-k2==1){
return true;
}
if(v2==1&&k2-k1==1){
return true;
}
if((v1==1&&k1==1)||(k2==1&&v2==1)){
return true;
}
}else if(map.size()==1){
for(int x:map.keySet()){
if(x==1||map.get(x)==1){
return true;
}
}
}
return false;
}
}