1781 所有子字符串美丽值之和

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

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

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

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

方法1:
主要思路:解题链接汇总
(1)滑动窗口;
(2)使用各个可能长度的滑动窗口去统计满足要求的美丽数;

class Solution {
    
    
public:
	//长度为 k 的滑动窗口下,统计美丽数
    int get_k(string&s, int k) {
    
    
		int res = 0;
		int cur_max = 0;
		int cur_min = 10000;
		vector<int> mp(26, 0);
		for (int i = 0; i < k; ++i) {
    
    
			++mp[s[i] - 'a'];
		}
		for (int&i : mp) {
    
    
			cur_max = max(cur_max, i);
			if (i != 0) {
    
    
				cur_min = min(cur_min, i);
			}
			
		}
		if (cur_min != 10000) {
    
    
			res += cur_max - cur_min;
		}
		int left = 0, right = k;
		while (right < s.size()) {
    
    
			++mp[s[right] - 'a'];
			--mp[s[left] - 'a'];
			cur_max = 0;
			cur_min = 10000;
			for (int&i : mp) {
    
    
				cur_max = max(cur_max, i);
				if (i != 0) {
    
    
					cur_min = min(cur_min, i);
				}
			}
			if (cur_min != 10000) {
    
    
				res += cur_max - cur_min;
			}
            ++right;
            ++left;
		}
		return res;
	}
	int beautySum(string s) {
    
    
		if (s.size() < 3) {
    
    
			return 0;
		}
		int res = 0;
		for (int i = 3; i <= s.size(); ++i) {
    
    //统计各个长度的滑动窗口
			res += get_k(s, i);
		}
		return res;
	}

go语言实现

func max(lhs,rhs int)int{
    
    
    if lhs>rhs {
    
    
        return lhs
    }
    return rhs
}
func min(lhs,rhs int)int{
    
    
    if lhs<rhs {
    
    
        return lhs
    }
    return rhs
}
func get_k(s string,k int)int {
    
    
    res :=0 
    cur_max := 0
    cur_min := 10000
    var mp [26]int
    for i:=0;i<k;i++ {
    
    
        mp[s[i]-'a']++
    }
    for _,v := range mp {
    
    
        cur_max=max(cur_max,v)
        if v!=0 {
    
    
            cur_min=min(cur_min,v)
        }
    }
    if cur_min!=10000 {
    
    
        res += cur_max-cur_min
    }
    left :=0
    right :=k
    for right < len(s) {
    
    
        mp[s[right]-'a']++
        mp[s[left]-'a']--
        cur_max=0
        cur_min=10000
        for _,v := range mp {
    
    
            cur_max=max(cur_max,v)
            if v!=0 {
    
    
                cur_min=min(cur_min,v)
            }
        }
        if cur_min!=10000 {
    
    
            res += cur_max-cur_min
        }
        right++
        left++
    }
    return res
}
func beautySum(s string) int {
    
    
    if len(s)<3 {
    
    
        return 0
    }
    res := 0
    for i:=3;i<=len(s);i++ {
    
    
        res+=get_k(s,i)
    }
    return res
}

猜你喜欢

转载自blog.csdn.net/weixin_44171872/article/details/115022831