1915-最美子字符串的数目-另类前缀和

写在前面

247场周赛第三题,没想到使用前缀和,看到大佬们十几行就做完了真的佩服。本文主要讲解思路,并配以完整代码供参考。

题目


最近力扣题目翻译的真是越来越晦涩了,比赛的时候看了半天才看懂啥事最美字符串。通俗来说,统计某字符串中各种字符出现的次数,其中,出现次数为奇数次的字符不超过一个,则称该字符串为最美字符串

核心思路

最简单直接的思路:枚举每个子串,并判断是否为最美字符串,统计答案。

判断是否为最美字符串

一种朴素的思想,使用一个cnts数组,存储每种字符出现的次数,然后遍历cnts数组判断是否奇数不超过一个即可。不过,题目中给出字符串只由前十个小写英文字母组成,并且只关注字符出现的是奇数次还是偶数次(只由两种选择),所以使用一个10bit的二进制数来记录一个字符串的状态还是很容易想到的,只要使用bitCount得到结果小于等于1,则该字符串为最美字符串。

问题

如果通过枚举+判断的方式统计结果,单纯枚举所有子串的时间复杂度为O(N ^ 2),已经无法满足10 ^ 5的数据量,更不用说遍历字符串得到是否为最美字符串了。

解决方案

既然枚举子串不能解决问题,肯定要将某个区间中的结果一次性计算出来,而常见的区间处理的方式就是前缀和了。我们不妨使用sum[i]表示前i个字符组成的子串的状态(即上述对应的二进制数),那么什么样的sum[i]和sum[j](j < i)是有关系的呢?我们通过下图理解。


可以看到状态值相同的两个状态中间可以形成一个答案,状态值有一位不同的两个状态之间也可以形成一个答案。而题目中只需要求出最美子字符串的个数即可,那么,我们不妨使用一个数组存储遍历到位置i时,状态sum出现次数,就可以得到如下的状态转移:

res += cnts[sum]
for(int i = 0; i < 10; i++){
    res += cnts[sum ^ (1 << i)];
}

这样我们就可以得到完整代码了。

完整代码

class Solution {
    public long wonderfulSubstrings(String word) {
        int sum = 0;
        int[] cnts = new int[1 << 10];
        cnts[0] = 1;
        long res = 0;

        for(char c : word.toCharArray()){
            sum = sum ^ (1 << (c - 'a'));
            res += cnts[sum];
            for(int i = 0; i < 10; i++){
                res += cnts[sum ^ (1 << i)];
            }
            cnts[sum]++;
        }
        return res;
    }
}

代码很短,也不难理解,最核心的思路就是通过前缀和得到区间中最美子字符串的个数,这里还是需要反复揣摩。
如果文章有任何问题,还请指出。
感恩相遇~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容