• LeetCode 0828. 统计子串中的唯一字符


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

    力扣题目链接:https://leetcode.cn/problems/count-unique-characters-of-all-substrings-of-a-given-string/

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

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

    本题将会给你一个字符串 s ,我们需要返回 countUniqueChars(t) 的总和,其中 ts 的子字符串。注意,某些子字符串可能是重复的,但你统计时也必须算上这些重复的子字符串(也就是说,你必须统计 s 的所有子字符串中的唯一字符)。

    由于答案可能非常大,请将结果 mod 10 ^ 9 + 7 后再返回。

     

    示例 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
      

       

      提示:

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

      方法一:存下标

      每个字符之间互不影响,因此我们分别统计每个字母即可。

      对于某个字母,要找到包含这个字母一次有且仅有一次的字符串,可以从某个“这个字母出现的位置”开始,左边选数个字母(不包含这个字母)、右边选数个字母。

      因此,如果字母 X X X的三个相邻的出现位置分别是 i i i j j j k k k,那么包含 s [ j ] s[j] s[j]一次的字符串种类有 ( j − i ) × ( k − j ) (j-i)\times(k-j) (ji)×(kj)个。

      因此,预处理一遍,统计每个字母出现的位置,再进行上述运算即可。

      • 时间复杂度 O ( n ) O(n) O(n),其中 n n n是字符串长度
      • 空间复杂度 O ( n ) O(n) O(n)

      AC代码

      C++
      class Solution {
      public:
          int uniqueLetterString(string& s) {
              int n = s.size();
              vector<int> location[26];
              for (int i = 0; i < 26; i++) {
                  location[i].push_back(-1);
              }
              for (int i = 0; i < n; i++) {
                  location[s[i] - 'A'].push_back(i);
              }
              for (int i = 0; i < 26; i++) {
                  location[i].push_back(n);
              }
              int ans = 0;
              for (int i = 0; i < 26; i++) {
                  if (location[i].size() == 2)
                      continue;
                  for (int j = 1; j + 1 < location[i].size(); j++) {
                      ans += (location[i][j] - location[i][j - 1]) * (location[i][j + 1] - location[i][j]);
                  }
              }
              return ans;
          }
      };
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25

      同步发文于CSDN,原创不易,转载请附上原文链接哦~
      Tisfy:https://letmefly.blog.csdn.net/article/details/126722643

    • 相关阅读:
      『heqingchun-ubuntu系统下Qt报错connot find -lGL解决方法』
      京东健康打开医疗服务的“脑机”接口
      led台灯哪个牌子质量好?2022最新的台灯牌子排名
      Mysql优化---锁机制、行锁及表锁
      双臂二指魔方机器人的制作(一)--总体设计
      jQuery系列之选择器
      事务(Transaction)逻辑应用
      ubuntu更换清华源
      基于HTML电商项目的设计与实现——html静态网站基于数码类电商购物网站网页设计与实现共计30个页面
      【无标题】
    • 原文地址:https://blog.csdn.net/Tisfy/article/details/126722643