算法日志 --- 12.26--- 统计同构子字符串的数目

86 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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);
    }
}

image.png