入门力扣自学笔记222 C++ (题目编号:1759)

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


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


思路:

首先,定义 mod = 1e9+7
其次,循环累计求和,每一段同构子串个数为 r - l + 1
最后,采用双指针,一个指针用于遍历整个循环数组,顺便充当终点。另一个指针用于满足特定情况,更新起点。


代码:

class Solution {
public:
    int countHomogenous(string s) {
        int res = 0;
        int r = 0, l = 0, mod = 1e9 + 7;
        while (r < s.size()) 
        {
            if (s[r] == s[l]) 
                res += r - l + 1; 
            else 
            {
                res++;
                l = r;
            }
            r++;
            res %= mod;
        }
        return res;
    }
};

你可能感兴趣的:(力扣算法学习,c++,leetcode,算法)