算法日志 --- 12.12---所有子字符串美丽值之和

77 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情

最近的疫情也是很严重啊,但并不妨碍我上班

所有子字符串美丽值之和

该题出自力扣的1781题 —— 所有子字符串美丽值之和【中等题】

审题

一个字符串的 美丽值 定义为:出现频率最高字符与出现频率最低字符的出现次数之差。 比方说,"abaacc" 的美丽值为 3 - 1 = 2 。 给你一个字符串 s ,请你返回它所有子字符串的 美丽值 之和。

  • 这是一道中等题,但是却没有什么意义,因为一眼就看到底了,题意很简单,就是给出一个字符串,通过返回字符串的美丽值之和
    • 所谓的美丽值之和就是统计出出现的最高频率和最低频率,并且返回和
    • 但是前提是要子字符串,也就是说要最少两种字符存在,并且其中一个有相同的字符
  • 开辟一个字符数组,转换字符串s作为字符数组,遍历字符数组作为第一次循环
  • 开辟一个26个长度的int数组,作为记录字符出现的频率和存在,从第一个层循环的下标开始做第二次循环
  • 也就是说当前的子字符串就被记录起来了,统计最多出现过的字符
  • 第三层循环遍历26长度的数组,如果出现过,那么取最小值
  • 最终统计叠加的值,用双层循环来遍历所有子字符串,第一层循环子字符串的起点 i,第二层循环固定 i。

编码

class Solution {
    public int beautySum(String s) {
        int res = 0;
        char[] chars = s.toCharArray();
        int len = chars.length;
        for (int i = 0; i < len; i++) {
            int[] a = new int[26];
            int max = 0;
            for (int j = i; j < len; j++) {
                a[chars[j] - 'a']++;
                int min = len;
                max = Math.max(a[chars[j] - 'a'],max);
                for (int k = 0; k < 26; k++) {
                    if (a[k] > 0){
                        min = Math.min(min,a[k]);
                    }
                }
                res+= max - min;

            }

        }
        return res;
    }
}

image.png