LeetCode_双指针_中等_1781.所有子字符串美丽值之和

目录

  • 1.题目
  • 2.思路
  • 3.代码实现(Java)

1.题目

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

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

示例 1:
输入:s = “aabcb”
输出:5
解释:美丽值不为零的字符串包括 [“aab”,“aabc”,“aabcb”,“abcb”,“bcb”] ,每一个字符串的美丽值都为 1。

示例 2:
输入:s = “aabcbaa”
输出:17

提示:
1 <= s.length <= 500
s 只包含小写英文字母。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sum-of-beauty-of-all-substrings

2.思路

(1)双指针 & 计数
① 定义双指针 i 和 j,分别指向子字符串的两端,并且使用双层循环来遍历得到所有的子字符串;
② 第一层循环遍历子字符串的起点 i,第二层循环中固定 i,遍历子字符串的终点 j;
③ 在遍历的过程使用长度为 26 的数组 freqs 来记录以 s[i] 开始的子字符串中的每个字母的频率,并逐步更新,其目的在于计算每个子字符串的美丽值,然后使用变量 res 来累加结果即可。

3.代码实现(Java)

//思路1————双指针 & 计数
class Solution {
    public int beautySum(String s) {
        int res = 0;
        int length = s.length();
        for (int i = 0; i < length; i++) {
        	// freqs 记录以 s[i] 开始的子字符串中的每个字母的频率,并逐步更新
            int[] freqs = new int[26];
            // maxFreq 记录以 s[i] 开始的子字符串中的最大频率,并逐步更新
            int maxFreq = 0;
            //开始遍历以 s[i] 开始的子字符串
            for (int j = i; j < length; j++) {
                char c = s.charAt(j);
                //更新当前字母 c 的频率
                freqs[c - 'a']++;
                //更新 maxFreq
                maxFreq = Math.max(maxFreq, freqs[c - 'a']);
                //找到当前子字符串 s[i...j] 中字符的最低频率
                int minFreq = length;
                for (int k = 0; k < 26; k++) {
                    if (freqs[k] > 0) {
                        minFreq = Math.min(minFreq, freqs[k]);
                    }
                }
                //累加 res
                res += maxFreq - minFreq;
            }
        }
        return res;
    }
}

你可能感兴趣的:(LeetCode,算法刷题,leetcode,双指针)