• 入门力扣自学笔记145 C++ (题目编号828)


    828. 统计子串中的唯一字符

    题目:

    我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符,并返回唯一字符的个数。

    例如:s = "LEETCODE" ,则其中 "L", "T","C","O","D" 都是唯一字符,因为它们只出现一次,所以 countUniqueChars(s) = 5 。

    本题将会给你一个字符串 s ,我们需要返回 countUniqueChars(t) 的总和,其中 t 是 s 的子字符串。输入用例保证返回值为 32 位整数。

    注意,某些子字符串可能是重复的,但你统计时也必须算上这些重复的子字符串(也就是说,你必须统计 s 的所有子字符串中的唯一字符)。


    示例 1:

    输入: s = "ABC"
    输出: 10
    解释: 所有可能的子串为:"A","B","C","AB","BC" 和 "ABC"。
         其中,每一个子串都由独特字符构成。
         所以其长度总和为:1 + 1 + 1 + 2 + 2 + 3 = 10


    示例 2:

    输入: s = "ABA"
    输出: 8
    解释: 除了 countUniqueChars("ABA") = 1 之外,其余与示例 1 相同。


    示例 3:

    输入:s = "LEETCODE"
    输出:92


    提示:

    1 <= s.length <= 10^5
    s 只包含大写英文字符

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/count-unique-characters-of-all-substrings-of-a-given-string
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


    思路:

    此题可以通过枚举子串的起点和终点来解决。

    在枚举每个起点时,用数组cntcnt记录26个大写字母出现的次数,用变量&val&记录当前的唯一字符个数,用变量avaava记录还没有重复的字符个数,当所有字符均已重复时,可以提前退出循环。


    代码:

    1. int cnt[26];
    2. class Solution {
    3. public:
    4. int uniqueLetterString(string s) {
    5. int n = s.size();
    6. int ans=0;
    7. //枚举子数组的起点
    8. for(int i=0;i
    9. memset(cnt,0,sizeof(int)*26);
    10. int ava=26;
    11. int val=0;
    12. //枚举子数组的终点
    13. for(int j=i;j
    14. int k=s[j]-'A';
    15. cnt[k]+=1;
    16. if(cnt[k]==1)
    17. val+=1;
    18. else if(cnt[k]==2){
    19. val-=1;
    20. ava-=1;
    21. }
    22. if(!ava)
    23. break;
    24. ans+=val;
    25. }
    26. }
    27. return ans;
    28. }
    29. };

  • 相关阅读:
    使用vue ui命令创建vue项目
    [2022-12-06]神经网络与深度学习hw11 - 各种优化算法比较
    算法基础学习笔记——⑦位运算
    BIO/NIO学习
    一对一,屏对屏,菊风远程同屏解决方案,助力多行业实现数字化协同
    测试用例设计方法之正交法
    FreeRTOS中断与任务之间同步(Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,422 )
    docker创建tomcat镜像与COPY与ADD 关键字的使用
    Java实用类-String
    【UML】详解UML类图
  • 原文地址:https://blog.csdn.net/DK_Sorhic/article/details/126717098