【教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;
    }
}
相关推荐
计信金边罗2 小时前
是否存在路径(FIFOBB算法)
算法·蓝桥杯·图论
MZWeiei2 小时前
KMP 算法中 next 数组的构建函数 get_next
算法·kmp
硅的褶皱2 小时前
对比分析LinkedBlockingQueue和SynchronousQueue
java·并发编程
MoFe13 小时前
【.net core】天地图坐标转换为高德地图坐标(WGS84 坐标转 GCJ02 坐标)
java·前端·.netcore
季鸢3 小时前
Java设计模式之观察者模式详解
java·观察者模式·设计模式
Fanxt_Ja3 小时前
【JVM】三色标记法原理
java·开发语言·jvm·算法
luofeiju4 小时前
行列式的性质
线性代数·算法·矩阵
緈福的街口4 小时前
【leetcode】347. 前k个高频元素
算法·leetcode·职场和发展
Mr Aokey4 小时前
Spring MVC参数绑定终极手册:单&多参/对象/集合/JSON/文件上传精讲
java·后端·spring
pen-ai4 小时前
【统计方法】基础分类器: logistic, knn, svm, lda
算法·机器学习·支持向量机