1、数学
我们可以使用数学进行分析:每当出现连续的 n n n个字符时,我们最终将其合在一起进行计算个数。显然我们可以获得的同构子字符串的个数应为 n × ( n + 1 ) 2 \frac{n \times (n+1)}{2} 2n×(n+1)。因此我们只需要遍历整个字符串,分别统计连续出现的字符串的长度即可计算,最终的时间复杂度为 O ( n ) O(n) O(n)。
class Solution {
public:
int countHomogenous(string s) {
int length = s.size(), low = 0, high = 0;
long long res = 0, mod = 1e9 + 7;
while (high != length) {
high = low;
while (s[low] == s[high]) {
++high;
}
res += (long long) (high - low) * (high - low + 1) / 2;
low = high;
}
return res % mod;
}
};