LeetCode 每日一题——1759. 统计同构子字符串的数目

1.题目描述

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

难度中等43

给你一个字符串 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

2.解题思路与代码

2.1 解题思路

典型的滑动窗口题目,我们使用 left 和 right 两个指针来表示滑动窗口的左右边界,首先记录初始位置的字符 ch,然后开始移动右边界 right,并记录 right 位置上的字符。此时比较 right 上的字符与前面记录的字符是否相同,如果相同统计当前窗口字符数并累加到结果上即 ans+=right-left+1。如果不相同说明前面一个相同字符子串已经结束,缩小窗口,让 left 移动到 right 上重新开始计算,并将 ch 记录当前 right 位置上的字符,由于单个字符也算相同字符子串,因此也要累加计算 ans+=right-left+1。

以字符串 “abbcccaa” 为例,初始化才开始的时候让 left 和 right 指向 0 位置,并且此时 ch 记录 ‘a’。

开始移动 right ,当 right 移动到 b 时,此时 right 字符与 ch 记录不同,需要将 left 移动到 right 位置并重新记录 ch 为当前 right 字符 ‘b’

继续移动 right 直到 right 指向字符 c,此时将 left 移动到 right 并在此记录 ch 为字符 ‘c’。重复这一系列操作直到字符串遍历完成。最后返回 ans 即可。

2.2 代码

class Solution {
    public int countHomogenous(String s) {
        long ans = 0;
        int l = 0, r = 0;
        char ch = s.charAt(r);
        while (r < s.length()) {
            if (ch!=s.charAt(r)){
                l = r;
                ch = s.charAt(r);
            }
            ans += r - l + 1;
            r++;
        }
        return (int) (ans % (Math.pow(10, 9) + 7));
    }
}

2.3 测试结果

通过测试

测试结果

3.总结

  • 使用字符 ch 记录字符,并用滑动窗口统计子串个数
  • 如果遇到不同字符移动 left 到 right 位置并重新记录 ch 为当前字符
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值