828. 统计子串中的唯一字符 --力扣 --JAVA

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

 题目

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

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

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

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

解题思路

    1. 按照元素进行统计,如果按照字符串进行统计会导致超时(种类过多);
    2. 在某个元素出现后,在它第二次出现之前,它保持唯一,这段区间内的数目为:(当前位置 - 上一次出现的位置) * (下一次出现的位置 - 当前位置);
    3. 对Map进行遍历累加获取结果值。

    代码展示

    class Solution {
        public int uniqueLetterString(String s) {
            int n = s.length();
            int ans = 0;
            //存储数据记录每个元素出现的次数
            Map<Character, List<Integer>> data = new HashMap<>();
            for (int i = 0; i < n; i++){
                List<Integer> temp = data.getOrDefault(s.charAt(i), new ArrayList<>());
                temp.add(i);
                data.put(s.charAt(i), temp);
            }
            //对每个元素进行计算,在该元素第二次出现之前,该元素为唯一字符
            for (List<Integer> list : data.values()){
                int head = -1; int tail = -1;
                for (int i = 0; i < list.size(); i++){
                    tail = (i < list.size() - 1) ? list.get(i + 1) : n;
                    ans += (list.get(i) - head) * (tail - list.get(i));
                    head = list.get(i);
                }
            }
            return ans;
        }
    }

    image.gif


    目录
    相关文章
    |
    4月前
    |
    Unix Shell Linux
    LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
    本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
    LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
    |
    2天前
    |
    自然语言处理 Java
    Java中的字符集编码入门-增补字符(转载)
    本文探讨Java对Unicode的支持及其发展历程。文章详细解析了Unicode字符集的结构,包括基本多语言面(BMP)和增补字符的表示方法,以及UTF-16编码中surrogate pair的使用。同时介绍了代码点和代码单元的概念,并解释了UTF-8的编码规则及其兼容性。
    75 60
    |
    3天前
    |
    存储 Java BI
    java怎么统计每个项目下的每个类别的数据
    通过本文,我们详细介绍了如何在Java中统计每个项目下的每个类别的数据,包括数据模型设计、数据存储和统计方法。通过定义 `Category`和 `Project`类,并使用 `ProjectManager`类进行管理,可以轻松实现项目和类别的数据统计。希望本文能够帮助您理解和实现类似的统计需求。
    38 17
    |
    3月前
    |
    算法 Java
    LeetCode(一)Java
    LeetCode(一)Java
    |
    5月前
    |
    算法 Java
    LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
    LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
    59 6
    |
    5月前
    |
    Java
    Java——编码GBK的不可映射字符
    Java——编码GBK的不可映射字符
    54 1
    |
    5月前
    |
    存储 算法 Java
    LeetCode经典算法题:打家劫舍java详解
    LeetCode经典算法题:打家劫舍java详解
    83 2
    |
    5月前
    |
    人工智能 算法 Java
    LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
    LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
    56 1
    |
    5月前
    |
    存储 算法 Java
    LeetCode经典算法题:预测赢家+香槟塔java解法
    LeetCode经典算法题:预测赢家+香槟塔java解法
    73 1