LeetCode-828-统计子串中的唯一字符

文章介绍了如何使用哈希表来记录字符串中每个字符的位置,通过计算相邻出现位置的差值来确定连续子字符串的数量,从而求解独特子字符串的总数。在C++代码示例中,遍历哈希表并对每个字符的出现位置进行分析,累加得到最终结果。
摘要由CSDN通过智能技术生成

在这里插入图片描述

1、数学

我们可以使用哈希表来记录字符串中每个字符出现的位置。考虑到子字符串必须是连续的,对于字符 s [ j ] s[j] s[j]而言,假设其上一次出现的位置是 i i i,下一次出现的位置是 k k k,显然我们可获得的字符串个数为 ( k − j ) × ( j − i ) (k-j) \times (j-i) (kj)×(ji)。我们可以遍历哈希表中的每一个字符,获得仅包含当前一个字符的子字符串并累加即可获得最终结果。

class Solution {
public:
    int uniqueLetterString(string s) {
        int n = s.size(), res = 0;
        unordered_map<char, vector<int>> hs;
        for (int i = 0; i < n; ++i) {
            hs[s[i]].emplace_back(i);
        }
        for (auto &&item: hs) {
            item.second.insert(item.second.begin(), -1);
            item.second.emplace_back(n);
            for (int i = 1; i < item.second.size() - 1; ++i) {
                res += (item.second[i] - item.second[i - 1]) * (item.second[i + 1] - item.second[i]);
            }
        }
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值