[杨小白]_leetcode_力扣_12月26日每日一题_1759. 统计同构子字符串的数目

85 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第31天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标2000分,现在1984!!

12月26日每日一题

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

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

代码

数学题

因为「同构子字符串」为一个连续的字符序列且需要序列中的字符都相同,我们要找的是每个字符对答案的贡献度。

对于abbcccaa

  • i = 0的a的贡献度为1
  • i = 1的b的贡献度为1
  • i = 2的b的贡献度为2
  • i = 3的c的贡献度为1
  • i = 4的c的贡献度为2
  • i = 5的c的贡献度为3
  • i = 6的a的贡献度为1
  • i = 7的a的贡献度为2
  • 所以答案就是1 + 1 + 2 + 1 + 2 + 3 + 1 + 2 = 13

不难发现,对于位于i的字母x,他的贡献值为前面连续相同字母的个数+1。

用双指针滑动窗口可解。

解法

class Solution {
    public int countHomogenous(String s) {
        int res = 0;
        int l = 0;
        int mod = 1000_000_007;
        char[] chars = s.toCharArray();
        for(int i = 0; i < chars.length; i++) {
            if(chars[i] == chars[l]) {
                res = res + i - l + 1;
            } else {
                l = i;
                res++;
            }
            res = res % mod;
        }
        return res;
    }
}