LeetCode 1759. 统计同构子字符串的数目
Posted Tisfy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1759. 统计同构子字符串的数目相关的知识,希望对你有一定的参考价值。
【LetMeFly】1759.统计同构子字符串的数目
力扣题目链接:https://leetcode.cn/problems/count-number-of-homogenous-substrings/
给你一个字符串 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 \\fracn(n+1)2 2n(n+1)个。
问题解决了。
Q&A:
-
为什么长度为 n n n的字符串,有 n ( n + 1 ) 2 \\fracn(n+1)2 2n(n+1)个子串?
长度为 1 1 1的子串有 n n n个,长度为 2 2 2的子串有 n − 1 n-1 n−1个,…,长度为 n n n的子串有 1 1 1个, 1 + 2 + ⋯ + n = n ( n + 1 ) 2 1+2+\\cdots+n=\\fracn(n+1)2 1+2+⋯+n=2n(n+1)
-
如何将“abbddd”解析为“1个a”、“2个b”、“3个d”这种格式?
我们使用一个变量 l a s t C h a r lastChar lastChar,记录上一个字符是什么。再使用一个变量 c n t cnt cnt,记录当前字符连续出现了多少个。如果当前字符和上一个字符不同,就说明刚刚出现了连续 c n t cnt cnt个 l a s t C h a r lastChar lastChar
- 时间复杂度 O ( l e n ( s ) ) O(len(s)) O(len(s))
- 空间复杂度 O ( 1 ) 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:https://letmefly.blog.csdn.net/article/details/128446642
以上是关于LeetCode 1759. 统计同构子字符串的数目的主要内容,如果未能解决你的问题,请参考以下文章
[M数学] lc1759. 统计同构子字符串的数目(数学+等差求和)