LeetCode 1759.统计同构自字符串的数目(c++)

95 阅读2分钟

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

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

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

二、思路分析

使用双指针的思想,设立两个指针p和q,首先遍历整个字符串,即用p指向每一个字符,每遍历一个字符先将ans加1,然后进入一个死循环,并判断该字符是否与它后面的一个字符相等,即使q=p+1,判断p是否等于q,是的话令q再加1,并使ans再加上q与p的差值;不等于的话则跳出死循环。

最后按题目的要求,返回ans对109 + 7取余后的结果。

三、AC代码

class Solution {
public:
    const int mod = 1e9 + 7;
    int countHomogenous(string s) {
        int n=s.size();
        long long ans=0,p,q,j;
        for(int i=0;i<n;i++){
            ans=ans+1;
            p=i;
            q=i+1;
            while(1){
                if(q<n&&s[q]==s[p]){
                    q++;
                    ans=ans+q-p;
                }
                else{break;}
            }
            i = q - 1;
        }
        return ans % mod;
    }
};

提交排名

image.png

四、总结

题目总体不难,需要熟练。