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


    目录
    相关文章
    |
    2月前
    |
    算法 Java
    LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
    LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
    40 6
    |
    2月前
    |
    存储 算法 Java
    LeetCode经典算法题:打家劫舍java详解
    LeetCode经典算法题:打家劫舍java详解
    56 2
    |
    2月前
    |
    人工智能 算法 Java
    LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
    LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
    43 1
    |
    2月前
    |
    存储 算法 Java
    LeetCode经典算法题:预测赢家+香槟塔java解法
    LeetCode经典算法题:预测赢家+香槟塔java解法
    41 1
    |
    2月前
    |
    存储 算法 Java
    LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
    LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
    66 0
    |
    2月前
    |
    算法 Java
    LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
    LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
    47 0
    |
    2月前
    |
    存储 算法 Java
    LeetCode初级算法题:两数之和+斐波拉契数列多种java解法
    LeetCode初级算法题:两数之和+斐波拉契数列多种java解法
    24 0
    |
    2月前
    |
    算法 Java 索引
    LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
    LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
    31 0
    |
    2月前
    |
    存储 算法 Java
    LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
    LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
    22 0
    |
    4月前
    |
    存储 算法 测试技术
    力扣经典150题第三十三题:最小覆盖子串
    力扣经典150题第三十三题:最小覆盖子串
    28 1