当前位置: 首页 > news >正文

2953. 统计完全子字符串(将题目中给的信息进行分组循环)

在这里插入图片描述

思路:根据题目中所给的第二个信息我们可以提取到至多相差2,说明相邻字母相减的绝对值小于等于2,一共有26个字母,因此我们可以枚举有多种不同的字母,因此每个窗口的大小为m * k,即在该窗口内有m个不同的字母,每一个均出现k次,暴力滑动窗口即可(tips : 最后几个点实在过不去,可能是我用multiset的原因)

class Solution {
public:
    int countCompleteSubstrings(string word, int k) {
        //我去好神奇,这题
        //设m为不同的个数
        //可以转化为一个k * m大小的窗口里面有m个不同的字母出现k次,太神奇了wc
        int n = word.size();
        int sum = 0;
        for(int m = 1; m <= 26; m ++)//将不同字母分组
        {
            int b[26] = {0}, cnt = 0;
            char c = word[0];//记录窗口的上一个是什么字符
            multiset<int>se;
            for(int i = 0, j = 0; i < n && k * m <= n; i ++)
            {
                if(i - j + 1 < k * m)
                {
                    b[word[i] - 'a'] ++;
                    if(b[word[i] - 'a'] == 1) cnt ++;
                    if(i != 0) se.insert(abs(word[i] - c));
                    c = word[i];
                }
                else {
                    b[word[i] - 'a'] ++;
                    if(b[word[i] - 'a'] == 1) cnt ++;//统计多少个不同的
                    if(i != 0 && m * k > 1) se.insert(abs(word[i] - c));
                    if(cnt == m)
                    {
                        int f = 0;
                        for(int o = 0; o <= 25; o ++)
                        {
                            if(b[o] != k && b[o] >= 1)
                            {
                                f = 1;
                                break;
                            }  
                        }
                        int u = 0;
                        if(se.size() >= 1)
                        u = *se.rbegin();
                        if(!f && u <= 2) sum ++;
                    }//相当于有两个条件的判断
                    b[word[j] - 'a'] --;
                    auto it = se.find(abs(word[j + 1] - word[j]));//nmd忘记取绝对值了
                    if(it != se.end()) se.erase(it) ;//只删除一个
                    c = word[i];
                    if(b[word[j] - 'a'] == 0) cnt --;
                    j ++;  
                }
            }
        }
        return sum;
    }
};

相关文章:

  • FRP多协议支持与高级功能解析
  • 新能源汽车充换站如何实现光储充一体化管理?
  • 可靠消息投递demo
  • 对接SaToken @SaCheckEL 鉴权注解
  • Linux-顺序队列练习-链式队列-树
  • cocos:从@ccclass装饰器到组件化开发
  • 大模型在舌癌预测及治疗方案制定中的应用研究
  • 软考中级网络工程师第六章网互联与互联网
  • VectorBT:Python量化交易策略开发与回测评估详解
  • sklearn基础教程
  • 【AVRCP】蓝牙链路控制器(LC)与AVRCP互操作性要求深度解析
  • 希尔排序中的Hibbard序列
  • AI大白话(四):自然语言处理——AI是如何理解和生成人类语言的?
  • 自动化测试框架详解
  • 车载软件架构 --- AUTOSAR AP/CP中诊断的区别
  • Python functools 模块的 @lru_cache 装饰器介绍
  • wps字符很分散
  • 【STM32】SPI通信协议W25Q64Flash存储器芯片(学习笔记)
  • OSS Browser2.0安装使用(阿里云对象存储OSS 图形化界面工具2.0版本)
  • 集成学习(下):Stacking集成方法
  • 日本航空自卫队一架练习机在爱知县坠毁
  • 杭州“放大招”支持足球发展:足球人才可评“高层次人才”
  • 最新研究:新型合成小分子可“精准杀伤”癌细胞
  • 融创中国:境外债务重组计划聆讯定于9月15日召开
  • 寒武纪陈天石:公司的产品力获得了行业客户广泛认可,芯片市场有望迎来新增量需求
  • 超新星|罚丢点球的那道坎,刘诚宇靠自己迈了过去