【1759. 统计同构子字符串的数目】

news/2024/7/9 6:34:01

来源:力扣(LeetCode)

描述:

给你一个字符串 s ,返回 s同构子字符串 的数目。由于答案可能很大,只需返回对 109 + 7 取余 后的结果。

同构字符串 的定义为:如果一个字符串中的所有字符都相同,那么该字符串就是同构字符串。

子字符串 是字符串中的一个连续字符序列。

示例 1:

输入:s = "abbcccaa"
输出:13
解释:同构子字符串如下所列:
"a"   出现 3 次。
"aa"  出现 1 次。
"b"   出现 2 次。
"bb"  出现 1 次。
"c"   出现 3 次。
"cc"  出现 2 次。
"ccc" 出现 1 次。
3 + 1 + 2 + 1 + 3 + 2 + 1 = 13

示例 2:

输入:s = "xy"
输出:2
解释:同构子字符串是 "x""y"

示例 3:

输入:s = "zzzzz"
输出:15

提示:

  • 1 <= s.length <= 105
  • s 由小写字符串组成

方法:数学

思路与算法

  题目给出一个长度为 n 的字符串 s,并给出「同构字符串」的定义为:如果一个字符串中的所有字符都相同,那么该字符串就是同构字符串。现在我们需要求 s 中「同构子字符串」的数目。

  因为「同构子字符串」为一个连续的字符序列且需要序列中的字符都相同,那么我们首先按照连续相同的字符来对字符串 ss 进行分组,比如对于字符串 “abbcccaa" 我们的分组结果为 [“a”, “bb”, “ccc”, “aa”]。因为对于一个组中字符串的任意子字符串都为「同构子字符串」,而一个长度为 m 的字符串的子字符串的数目为 m×(m+1) / 2。那么我们对于每一个组来统计其贡献的「同构子字符串」数目并求和即可。

代码:

class Solution {
public:
    int countHomogenous(string s) {
        long long res = 0;
        long long mod = 1e9 + 7;
        int prev = s[0];
        int cnt = 0;
        for (auto c : s) {
            if (c == prev) {
                cnt++;
            } else {
                res += (long long)(cnt + 1) * cnt / 2;
                cnt = 1;
                prev = c;
            }
        }
        res += (long long)(cnt + 1) * cnt / 2;
        return res % mod;
    }
};

执行用时:8 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:11.4 MB, 在所有 C++ 提交中击败了47.57%的用户
复杂度分析
时间复杂度:O(n),其中 n 字符串 s 的长度。
空间复杂度:O(1)。仅使用常量空间。
author:LeetCode-Solution


http://lihuaxi.xjx100.cn/news/497297.html

相关文章

UE5 Meerkat狐獴演示Demo分析

1.特效的生成方式 1.1临时特效的生成&#xff1a;使用了已生成轨道临时创建该特效&#xff08;不用在场景中放入该特效&#xff0c;而是临时创建即可&#xff09;、系统生命周期轨道设置该特效的播放时长 1.2长期特效的生成&#xff1a;特效时长为该镜头片段长度 2.特效的类…

client-go源码学习(一):client-go源码结构、Client客户端对象

本文基于Kubernetes v1.22.4版本进行源码学习&#xff0c;对应的client-go版本为v0.22.4 1、client-go源码结构 client-go的代码库已经集成到Kubernetes源码中了&#xff0c;源码结构示例如下&#xff1a; $ tree vendor/k8s.io/client-go -L 1 vendor/k8s.io/client-go ├─…

一个umi4的项目适配到FireFox60.7.1esr版本上的从头到尾

项目场景&#xff1a; 一个使用umi4创建的大屏项目&#xff0c;用户的浏览器使用的是火狐60.7.1的稳定版。然后就报错了&#xff01;&#xff01;&#xff01; 为什么不让用户换谷歌嘞&#xff0c;咱也不知道。那咱就搞兼容吧~~ 贴个浏览器的版本图片&#xff1a; 问题历程 …

jQuery index()

jQuery index() 概述 在jQuery中&#xff0c;我们可以使用index()方法来获取当前jQuery对象集合中“指定元素”的索引值。 语法 $(元素).index()说明 index()方法可以接受一个“jQuery对象”或“DOM对象”作为参数&#xff0c;不过一般情况下&#xff0c;我们很少会使用到…

Node.js--》Node环境及nvm版本管理安装及使用

目录 初识Node.js Node.js环境安装 nvm的安装 Node.js环境执行JS代码 初识Node.js Node.js是一个开源、跨平台的 JavaScript 运行时环境。其中文的官方网址为&#xff1a;Node.js官方网址 注意&#xff1a;浏览器是JavaScript的前端运行环境&#xff1b;Node.js是JavaScri…

20221226关于电商平台呼叫中心相关指标的预测(cpo、订单瑕疵、客诉率、服务率等)

一、背景:呼叫中心的人力招聘、排班强依赖业务对服务率和订单的预测,预测的精准度直接影响成本和客户体验。 1.对成本的影响: ①客服招聘过多,造成人力冗余,导致服务成本增加; ②客服招聘少,需要启动临时招聘和借调,造成服务成本增加; ③客服排班人多,造成客服工作不…

基于redis缓存查询店铺

基于redis缓存查询店铺 Overridepublic Result queryById(Long id) {//从redis中查询商铺缓存String shopJson stringRedisTemplate.opsForValue().get(CACHE_SHOP_KEY id);//判断缓存是否命中if (StrUtil.isNotBlank(shopJson)){//命中&#xff0c;则返回店铺信息Shop shop …

第二十六章 数论——欧拉函数(详解与证明)

第二十六章 数论——欧拉函数&#xff08;详解与证明&#xff09;欧拉函数1、互质2、欧拉函数的定义3、欧拉函数的公式4、欧拉函数的证明5、欧拉函数的使用&#xff08;1&#xff09;问题一&#xff1a;思路代码&#xff08;2&#xff09;问题二&#xff1a;思路case1case1case…