统计同构子字符串的数目

news/2024/7/9 5:05:22

题目

给你一个字符串 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 由小写字符串组成

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/count-number-of-homogenous-substrings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

  • 数学
    aaa 出现同构字符串的数目为3+2+1,aaaa 出现同构字符串的数目为4+3+2+1,aaaaa 出现同构字符串的数目为5+4+3+2+1。明显是等差数列。
    等差数列的求和公式为Sn=m*(m+1)/2。
    所以求出每一小项的同构字符串求和即可。例如“abbcccaa”可以拆解为a,bb,ccc,aa。通过一次遍历即可。
    代码中需要注意处理最后一项。
public static int countHomogenous(String s) {
        if(s.length()==1)
        {
            return 1;
        }
        long res = 0;
        char begin = s.charAt(0);
        int beginIndex=0;
        for (int i = 1; i < s.length(); i++) {
            if(begin!=s.charAt(i) && i!=s.length()-1)
            {
                long length = i-beginIndex;
                res+= (length*(length+1))/2;
                beginIndex=i;
                begin=s.charAt(i);
            }
            //
            if(begin==s.charAt(i) && i==s.length()-1)
            {
                long length = i-beginIndex+1;
                res+= (length*(length+1))/2;
            }
            if(begin!=s.charAt(i) && i==s.length()-1)
            {
                long length = i-beginIndex;
                res+= (length*(length+1))/2+1;
            }
        }
        return (int)(res%1000000007);
    }

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

相关文章

【案例实践】基于Citespace和vosviewer文献计量学可视化SCI论文高效写作方法

【点击观看视频】基于Citespace和vosviewer文献计量学可视化SCI论文高效写作方法 文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技…

Ubuntu系统中文乱码的解决办法

Ubuntu系统中文乱码的解决办法 文章目录Ubuntu系统中文乱码的解决办法1. 安装中文语言2. 安装语言设置的命令locale3. 安装中文的相关字体4. 修改语言的环境变量4.1 环境变量一4.2 设置二5. 正式配置语言后记最近在docker上pull下面的Ubuntu镜像运行后发现中文出现了乱码情况&a…

Windows和Mac系统实现本地部署WebPageTest工具

在项目开发或者测试的过程中&#xff0c;由于没有上线&#xff0c;我们在公网上无法访问我们的网站&#xff0c;但同时我们又需要查看浏览器性能&#xff0c;这样我们就需要在本地部署WebPageTest工具以协助进行性能测试 具体实现步骤&#xff1a; Windows系统&#xff1a; …

20.tornado项目结束(简单拓展一些技术栈)

本tornado项目从最开始的实现hello world到最后完整做成了一个不是很美观的但是&#xff01;各个功能完善的一个仿Instagram的网站项目。 相信大家如果认认真真跟着做下来&#xff0c;会学到很多&#xff01; 关于本项目也没什么需要多说的了&#xff0c;tornado已经早几年就几…

算法leetcode|26. 删除有序数组中的重复项(rust重拳出击)

文章目录26. 删除有序数组中的重复项&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a;分析&#xff1a;题解&#xff1a;rustgoccpythonjava26. 删除有序数组中的重复项&#xff1a; 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元…

技术开发107

技术开发107 业务内容&#xff1a; 汽车音响等汽车电子部件试制、电子设备部件试制、精密钣金试制精密钣金试制 公司简介&#xff1a; 代表&#xff1a;中山尚美 成立时间&#xff1a;1950年6月 资本金&#xff1a;1000万日元 员工数&#xff1a;15名 资格认证&#xff…

【Axure高保真原型】移动端钱包原型模板

今天和大家分享移动端钱包的原型模板&#xff0c;里面包含了11大模块&#xff0c;各个模块都是高保真高交互的原型模板&#xff0c;大家可以在演示地址里体验哦 【原型预览及下载地址】 https://axhub.im/ax9/4c3757a85d201a4c/#c1 这个原型还可以在手机上演示哦&#xff0c…

「设计模式」责任链模式

「设计模式」责任链模式 文章目录「设计模式」责任链模式一、概述二、结构三、案例实现四、优缺点五、应用场景六、模拟过滤器机制七、拓展八、小结一、概述 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;为请求创建了一个接收者对象的链。这种模式给予…