贪心算法+滑动窗口(47双周赛)

贪心算法+滑动窗口

题目:

一个字符串的 美丽值 定义为:出现频率最高字符与出现频率最低字符的出现次数之差。

比方说,"abaacc" 的美丽值为 3 - 1 = 2 。
给你一个字符串 s ,请你返回它所有子字符串的 美丽值 之和

 

c++实现

class Solution {
public:
    int beautySum(string s) {
        int n = s.size(), sum = 0;
        for(int len = 2; len <= n; ++len){
            int r = 0, l = 0, minN = INT_MAX, maxN = INT_MIN;
            vector<int> nums(26, 0); // 使用数组存储每个字符的数量
            while(r < n){                     // 滑动窗口
                nums[s[r] - 'a']++;            //右端点移入,增加
                r++;                            //区间右端点移动
                if(r - l == len){                //右端点减左端点等于区间长度,说明这个长度的区间已经极限了,去求美丽值
                    minN = INT_MAX;
                    maxN = INT_MIN;
                    for(int i = 0; i < 26; ++i){
                        if(nums[i] > 0){
                            minN = min(minN, nums[i]);
                            maxN = max(maxN, nums[i]);
                        }
                    }
                    sum += maxN - minN;

                    nums[s[l] - 'a']--;            //左端点移出,减小
                    l++;
                }
            }
        }
        return sum;
    }
};

java

class Solution {
    public int beautySum(String s) {
       int length=s.length();
       int sum=0;
       for(int k=3;k<=length;k++){
           int l=0;
           int r=0;
           int min=Integer.MAX_VALUE;
           int max=Integer.MIN_VALUE;
           int[] count=new int[26];
           while(r<length){
               count[s.charAt(r)-'a']++;
               r++;
               while(l+k==r){
                   min=Integer.MAX_VALUE;
                   max=Integer.MIN_VALUE;
                   for(int i=0;i<26;i++){
                       if(count[i]>0){
                         min=Math.min(min,count[i]);
                         max=Math.max(max,count[i]);
                       }
                   }
                   sum+=max-min;
                   count[s.charAt(l)-'a']--;
                   l++;
               }
           }
       }
       return sum;
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值