所有子字符串美丽值之和
难度:
标签:
题目描述
代码结果
运行时间: 1043 ms, 内存: 16.1 MB
/*
* The beauty value of a string is defined as the difference between the
* frequency of the most common character and the least common character.
* For example, the beauty value of 'abaacc' is 3 - 1 = 2.
* The task is to find the sum of the beauty values of all substrings of a given string.
*/
import java.util.stream.IntStream;
import java.util.stream.Stream;
import java.util.stream.Collectors;
import java.util.Arrays;
public class SolutionStream {
public int beautySum(String s) {
return IntStream.range(0, s.length())
.flatMap(i -> IntStream.range(i + 1, s.length() + 1)
.map(j -> s.substring(i, j))
.mapToInt(substr -> {
int[] freq = new int[26];
substr.chars().forEach(ch -> freq[ch - 'a']++);
int maxFreq = Arrays.stream(freq).max().getAsInt();
int minFreq = Arrays.stream(freq)
.filter(f -> f > 0)
.min().getAsInt();
return maxFreq - minFreq;
}))
.sum();
}
}
解释
方法:
该题解使用了一个嵌套循环的方法,外层循环遍历字符串s的所有可能的起始位置i,内层循环遍历从位置i开始的所有可能的结束位置j。对于每个子字符串s[i:j+1],使用一个哈希表h来记录每个字符的出现次数。同时,记录并更新当前子字符串中出现最频繁的字符的出现次数maxVal和出现最少的字符的出现次数minVal。每次内循环计算出一个新的子字符串时,都会更新哈希表,并重新计算maxVal和minVal,然后计算当前子字符串的美丽值(maxVal - minVal),并将其累加到总计数cnt中。最终返回总计数cnt作为所有子字符串的美丽值之和。
时间复杂度:
O(n^2 * k)
空间复杂度:
O(1)
代码细节讲解
🦆
为什么在每次内循环的结束时重新计算最低频率minVal,而不是在字符频率更新后立即进行?这样做有什么优缺点?
▷🦆
在该算法中,哈希表h的更新策略是什么?它是如何处理字符的初始化和频率更新的?
▷🦆
算法中提到用maxVal和minVal来记录最大和最小频率,但在初始设置时这两个变量的值如何确定?
▷🦆
这种算法有效率问题吗?考虑到每次添加一个新字符就重新计算最小值,是否有更高效的方式来维护这个最低频率?
▷