【教3妹学编程-算法题】统计子串中的唯一字符

3妹 :"太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包"
2哥 :3妹,什么事呀这么开发。
3妹 :2哥你看今天的天气多好啊,阳光明媚、万里无云、秋高气爽,适合秋游。
2哥 :是啊,立冬之后天气多以多云为主,好不容易艳阳高照。可是你不能秋游,赶紧收拾收拾上班去啦
3妹 :哼, 好吧~
2哥 :给你出了一道题发你微信里了, 上班通勤的路上记得看一下,回来问你答案~

3妹:知道啦,难不倒我!

题目:

我们定义了一个函数 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 <= 105

s 只包含大写英文字符

思路:

分别计算每个字符的贡献,

对于下标为 i 的字符 ci,当它在某个子字符串中仅出现一次时,它会对这个子字符串统计唯一字符时有贡献。只需对每个字符,计算有多少子字符串仅包含该字符一次即可。对于 ci, 记同字符上一次出现的位置为 cj ,下一次出现的位置为 ck,那么这样的子字符串就一共有 (ci−cj)×(ck−ci)种,即子字符串的起始位置有 cj不含)到 ci(含)之间这 (ci−cj)种可能,到结束位置有 (ck−ci)种可能。可以预处理 sss,将相同字符的下标放入数组中,方便计算。最后对所有字符进行这种计算即可。

java代码:

class Solution {
    public int uniqueLetterString(String s) {
        Map<Character, List<Integer>> index = new HashMap<Character, List<Integer>>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (!index.containsKey(c)) {
                index.put(c, new ArrayList<Integer>());
                index.get(c).add(-1);
            }
            index.get(c).add(i);
        }
        int res = 0;
        for (Map.Entry<Character, List<Integer>> entry : index.entrySet()) {
            List<Integer> arr = entry.getValue();
            arr.add(s.length());
            for (int i = 1; i < arr.size() - 1; i++) {
                res += (arr.get(i) - arr.get(i - 1)) * (arr.get(i + 1) - arr.get(i));
            }
        }
        return res;
    }
}
相关推荐
贵州晓智信息科技9 分钟前
如何优化求职简历从模板选择到面试准备
面试·职场和发展
小池先生9 分钟前
springboot启动不了 因一个spring-boot-starter-web底下的tomcat-embed-core依赖丢失
java·spring boot·后端
CodeClimb13 分钟前
【华为OD-E卷-木板 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
odng16 分钟前
IDEA自己常用的几个快捷方式(自己的习惯)
java·ide·intellij-idea
CT随24 分钟前
Redis内存碎片详解
java·开发语言
brrdg_sefg33 分钟前
gitlab代码推送
java
游是水里的游1 小时前
【算法day19】回溯:分割与子集问题
算法
不想当程序猿_1 小时前
【蓝桥杯每日一题】分糖果——DFS
c++·算法·蓝桥杯·深度优先
hanbarger1 小时前
mybatis框架——缓存,分页
java·spring·mybatis
cdut_suye1 小时前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python