侧边栏壁纸
博主头像
Terry

『LESSON 5』

  • 累计撰写 90 篇文章
  • 累计创建 21 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

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

Terry
2023-01-01 / 0 评论 / 0 点赞 / 74 阅读 / 519 字 / 正在检测是否收录...

题目

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

标签: 数学 字符串

代码

public class CountHomogenous {

    class Solution {
        public int countHomogenous(String s) {
            // 由例子可知,连续相同字符的结果为x=1+2+3+...+n=n*(n+1)/2,所以我们只要拿到每次连续字符的长度并计算出x,然后再加起来即可,这里可以使用双指针来完成
            int len = s.length();
            int mod = 1000000007;
            // 这里要设置为long,不然n*(n+1)有可能越界
            long count = 0;
            int left = 0;
            int right = 0;
            // 双指针
            while (right < len) {
               // 当小于长度并且字符相等的时候,right+1,那么此时得到的结果就是连续相同字符的长度n=right-left
                while (right < len && s.charAt(left) == s.charAt(right)) {
                    right++;
                }
                long n = right - left;
                // 加起来
                count += (1 + n) * n / 2;
                left = right;
            }
            return (int) (count % mod);
        }

        public int countHomogenous1(String s) {
            // 另外一种方式,每次相同的时候加上长度即是结果
            int ans = 0;
            int left = 0;
            int right = 0;
            while (right < s.length()) {
                if (s.charAt(right) != s.charAt(left)) {
                    left = right;
                }
                ans = (ans + (right - left + 1)) % 1000000007;
                right++;
            }
            return ans;
        }

    }

}

链接

0

评论区