23.04.29每日一题

23.04.29每日一题

题目意思就是字符串中去掉一个字符能满足剩下字符出现频率一样就返回true.

我的思路

  1. 统计字符串中每个字符出现的次数

  2. 然后统计出现的频率次数对应以及该出现该频率的字符数

  3. 分类什么情况可以满足要求如果统计出现频率次数于无论怎么删除都没有用,所以值考虑 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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值