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

40 阅读2分钟

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

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

力扣题目链接:leetcode.cn/problems/co…

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

方法一:遍历统计

“同构”要求字符串中的所有字符必须相同;“子串”要求字符串必须连续。

所以,目标明确了,这不就是让我们统计原串中的“连续且相同子串”吗?

我们需要做的,是将原串“abbddd”解析为“1个a”、“2个b”、“3个d”。

接下来问题就变成了,连续的“n个a”,有多少子串?答案是n(n+1)2\frac{n(n+1)}{2}个。

问题解决了。

Q&A:

  1. 为什么长度为nn的字符串,有n(n+1)2\frac{n(n+1)}{2}个子串?

    长度为11的子串有nn个,长度为22的子串有n1n-1个,......,长度为nn的子串有11个,1+2++n=n(n+1)21+2+\cdots+n=\frac{n(n+1)}{2}

  2. 如何将“abbddd”解析为“1个a”、“2个b”、“3个d”这种格式?

    我们使用一个变量lastCharlastChar,记录上一个字符是什么。再使用一个变量cntcnt,记录当前字符连续出现了多少个。如果当前字符和上一个字符不同,就说明刚刚出现了连续cntcntlastCharlastChar

  • 时间复杂度O(len(s))O(len(s))
  • 空间复杂度O(1)O(1)

AC代码

C++

typedef long long ll;
const ll mod = 1e9 + 7;
class Solution {
public:
    int countHomogenous(string s) {
        ll ans = 0;
        char lastChar = s[0];
        ll cnt = 0;
        for (char c : s) {
            if (c != lastChar) {
                ans = (ans + cnt * (cnt + 1) / 2) % mod;
                printf("ans = %lld\n", ans);  //**********
                cnt = 1, lastChar = c;
            }
            else {
                cnt++;
            }
        }
        ans = (ans + cnt * (cnt + 1) / 2) % mod;
        return ans;
    }
};

同步发文于CSDN,原创不易,转载请附上原文链接哦~ Tisfy:letmefly.blog.csdn.net/article/det…