C++ LeetCode1781题解所有子字符串美丽值之和

 更新时间:2022年12月16日 10:54:15   作者:LetMeFly  
这篇文章主要为大家介绍了C++ LeetCode1781题解所有子字符串美丽值之和,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

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

力扣题目链接:leetcode.cn/problems/su…

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

  • 比方说,"abaacc" 的美丽值为 3 - 1 = 2 。

给你一个字符串 s ,请你返回它所有子字符串的 美丽值 之和。

示例 1:

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

示例 2:

输入:s = "aabcbaa"
输出:17

提示:

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

方法一:前缀和

我们分别统计出26种字母的前缀和

这样,我们只需要枚举子串区间(两重循环枚举子串首尾),再统计出这个区间中,字母的最大和最小出现频率,累加到答案中即可。

AC代码

C++

class Solution {
public:
    int beautySum(string s) {
        int n = s.size();
        vector<vector<int>> prefix(26, vector<int>(n + 1));
        for (int i = 1; i <= n; i++) {
            for (int c = 0; c < 26; c++) {
                prefix[c][i] = prefix[c][i - 1];
            }
            prefix[s[i - 1] - 'a'][i]++;
        }
        int ans = 0;
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                int M = 0, m = 1000;
                for (int c = 0; c < 26; c++) {
                    int thisC = prefix[c][j + 1] - prefix[c][i];
                    M = max(M, thisC);
                    if (thisC) {  // 不能出现0次
                        m = min(m, thisC);
                    }
                }
                // printf("i = %d, j = %d, M = %d, m = %d\n", i, j, M, m);  //***********
                ans += M - m;
            }
        }
        return ans;
    }
};

方法二:边遍历边计算

方法一中,我们预处理使用前缀和计算出了每种元素的出现情况。但是每种字母的前缀和都需要O(len(s))O(len(s))O(len(s))的空间复杂度来保存

方法二中,我们不提前预处理计算出字母的出现情况,而是在枚举字符串终点的同时计算。这样,空间复杂度就减小了一个维度。

AC代码

C++

class Solution {
public:
    int beautySum(string s) {
        int ans = 0;
        int n = s.size();
        for (int i = 0; i < n; i++) {
            int cnt[26] = {0};  // 只需要开辟O(C)的空间
            for (int j = i; j < n; j++) {
                cnt[s[j] - 'a']++;  // 枚举子串终点的同时统计元素出现的次数
                int M = 0, m = 1000;
                for (int d = 0; d < 26; d++) {
                    M = max(M, cnt[d]);
                    if (cnt[d])
                        m = min(m, cnt[d]);
                }
                ans += M - m;
            }
        }
        return ans;
    }
};

以上就是C++ LeetCode1781题解所有子字符串美丽值之和的详细内容,更多关于C++ 子字符串美丽值和的资料请关注脚本之家其它相关文章!

相关文章

  • C++调用Python基础功能实例详解

    C++调用Python基础功能实例详解

    c++调用Python首先安装Python,本文以win7为例,给大家详细介绍C++调用Python基础功能,需要的朋友参考下吧
    2017-04-04
  • 浅谈c++ 字符类型总结区别wchar_t,char,WCHAR

    浅谈c++ 字符类型总结区别wchar_t,char,WCHAR

    下面小编就为大家带来一篇浅谈c++ 字符类型总结区别wchar_t,char,WCHAR。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • C++ OpenCV实战之标记点检测的实现

    C++ OpenCV实战之标记点检测的实现

    这篇文章主要介绍了如何利用C++ OpenCV实现关键点的检测,文中的示例代码讲解详细,对我们学习OpenCV有一定帮助,感兴趣的小伙伴可以了解一下
    2022-03-03
  • 推荐几款C/C++的编译器、编译环境(非常全面的比较)

    推荐几款C/C++的编译器、编译环境(非常全面的比较)

    这篇文章主要介绍了C/C++编译器的一些易混淆概念,这里脚本之家小编特为大家分享一下,需要的朋友可以参考下
    2021-06-06
  • 关于C++虚继承的内存模型问题

    关于C++虚继承的内存模型问题

    C++虚继承的内存模型是一个老生常谈的话题,实现方法主要依赖于编译器,本文从多个角度通过代码详解C++中虚继承的内存模型知识,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • C/C++ Qt ToolBar菜单组件的具体使用

    C/C++ Qt ToolBar菜单组件的具体使用

    ToolBar工具栏在所有窗体应用程序中都广泛被使用,使用ToolBar可以很好的规范菜单功能分类,本文就详细的介绍一下ToolBar组件的应用,感兴趣的可以了解一下
    2021-11-11
  • 对C语言中指针的理解与其基础使用实例

    对C语言中指针的理解与其基础使用实例

    这篇文章主要介绍了对C语言中指针的理解与其基础使用实例,文中援引了知乎热门问题"为什么说指针是 C 语言的精髓?"中的精彩回答,需要的朋友可以参考下
    2016-03-03
  • C++浅析程序中内存的分布

    C++浅析程序中内存的分布

    这篇文章主要介绍了C++内存分布及用法,从内存的基础概念到内存分配进行了讲解,内存是我们开发中最重要的一部分,往往逻辑上的错误就会造成内存泄漏,导致程序无法运行,下面我们就来了解文章对该内容的详细介绍
    2022-08-08
  • STl中的排序算法详细解析

    STl中的排序算法详细解析

    全排序即把所给定范围所有的元素按照大小关系顺序排列。sort采用的是成熟的"快速排序算法"(目前大部分STL版本已经不是采用简单的快速排序,而是结合内插排序算法)
    2013-09-09
  • C++读取文本文件中的汉字乱码情况原因及解决

    C++读取文本文件中的汉字乱码情况原因及解决

    本文介绍简体中文Windows操作系统中,C++读取文本文件中的汉字乱码情况原因及解决,文中通过代码和图文给大家介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-01-01

最新评论