开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情
终于到最后一天了,芜湖~
统计同构子字符串的数目
该题出自力扣的1759题 —— 统计同构子字符串的数目【中等题】
审题
给你一个字符串 s ,返回 s 中 同构子字符串 的数目。由于答案可能很大,只需返回对 109 + 7 取余 后的结果。 同构字符串 的定义为:如果一个字符串中的所有字符都相同,那么该字符串就是同构字符串。 子字符串 是字符串中的一个连续字符序列。
- 这道题题意并不复杂,要说是中等题,确实是有点过了,给出一个字符串,返回同构字符串的数量,所谓的同构字符串也就是一段字符串内,相同字符则作为同构字符串
- 一开始翻车是因为没有意识到,一个连续的字符串,本身每多出一个字符都会作为对之前的加一,也就是有k个同构字符串,就会 1+2+3+...+k个数量,同构字符串aa出现4次,aaaa出现3次,aaaaaa出现2次,aaaaaaaa出现1次。可以看出对于长度为nn的相同字母的连续字串,同构字符串的出现次数为1 + 2 + ... + n1+2+...+n, 即(n+1)*n / 2(n+1)∗n/2。
- 也是因为长度的问题,long型和int型,利用等差数列的公式,就能套现了
- 那么我们对于每一个组来统计其贡献的同构子字符串数目并求和,直接对每次的变量k求和
- 一开始想复杂了,打算把每种符合条件的同构子串有多少种都统计出来,还用了个哈希表来计数,结果总是超时。
编码
class Solution {
public int countHomogenous(String s) {
long sum =1, k =1;
char[] chars = s.toCharArray();
// char index = '0';
for (int i = 1; i < chars.length ; i++) {
if (chars[i] != chars[i -1]){
k =1;
}else {
k++;
}
sum += k;
}
return (int) (sum % 1000000007);
}
}