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

每日OJ_牛客_小红的子串_滑动窗口+前缀和_C++_Java

目录

牛客_小红的子串_滑动窗口+前缀和

题目解析

C++代码

Java代码


牛客_小红的子串_滑动窗口+前缀和

小红的子串

描述:
        小红拿到了一个长度为nnn的字符串,她准备选取一段子串,满足该子串中字母的种类数量在[l,r]之间。小红想知道,一共有多少种选取方案?

输入描述:

第一行输入三个正整数 n,l,rn,
第二行输入一个仅包含小写字母的字符串。
1 ≤ n ≤ 200000
1 ≤ l ≤ r ≤ 26

输出描述:

合法的方案数。


题目解析

        利用前缀和的思想,求种类个数在 [l, r] 区间内子串的个数,等于求 [1, r] 区间内个数 - [1, l - 1] 区间内个数。求种类个数在 [1, count] 区间内子串的个数,可以用滑动窗口来求解。

C++代码

#include <iostream>
#include <string>
using namespace std;
int n, l, r;
string s;

// 找出字符种类在 [1, x] 之间的⼦串的个数
long long find(int x) 
{
    if(x == 0)
        return 0;
    int left = 0, right = 0; // 滑动窗⼝
    int hash[26] = { 0 }, kinds = 0; // 统计窗⼝内字符种类的个数
    long long ret = 0;

    while(right < n)
    {
        if(hash[s[right] - 'a']++ == 0) kinds++;
        while(kinds > x)
        {
            if(hash[s[left] - 'a']-- == 1) kinds--;
            left++;
        }
        ret += right - left + 1;
        right++;
    }
    return ret;
}

int main()
{
    cin >> n >> l >> r >> s;
    cout << find(r) - find(l - 1) << endl;
    return 0;
}

Java代码

import java.util.*;
public class Main
{
    public static int n, l, r;
    public static char[] s;

    // 找出字符种类在 [1, x] 之间的⼦串的个数
    public static long find(int x)
    {
        // 滑动窗⼝
        int left = 0, right = 0;
        int[] hash = new int[26];
        int kinds = 0; // 统计窗⼝内字符的种类
        long ret = 0;

        while(right < n)
        {
            if(hash[s[right] - 'a']++ == 0)
                kinds++;
            while(kinds > x)
            {
                if(hash[s[left] - 'a']-- == 1)
                    kinds--;
                left++;
            }
            ret += right - left + 1;
            right++;
        }

        return ret;
    }

    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        n = in.nextInt(); l = in.nextInt(); r = in.nextInt();
        s = in.next().toCharArray();

        System.out.println(find(r) - find(l - 1));
    }
}

http://www.kler.cn/a/523463.html

相关文章:

  • 【C语言】static关键字的三种用法
  • 简要介绍C语言和c++的共有变量,以及c++特有的变量
  • 【redis】redis操作set类型的key发生了什么?
  • 视频拼接,拼接时长版本
  • [MySQL]事务的理论、属性与常见操作
  • 微服务(一)
  • 实验二 数据库的附加/分离、导入/导出与备份/还原
  • XCTF Illusion wp
  • 【C++动态规划 状态压缩】2741. 特别的排列|2020
  • 在FreeBSD下安装Ollama并体验DeepSeek r1大模型
  • 循序渐进kubernetes-RBAC(Role-Based Access Control)
  • Vue.js Vuex 持久化存储(持久化插件)
  • 【Linux探索学习】第二十七弹——信号(一):Linux 信号基础详解
  • 小阿卡纳牌
  • Python 数据分析 - 初识 Pandas
  • Git Bash 配置 zsh
  • webpack 打包自己的--windows
  • 乌兰巴托的夜---音乐里的故事
  • Redis部署方式全解析:优缺点大对比
  • 2025.1.26——1400
  • Winform如何取消叉号,减号和放大(两种)
  • Linux文件基本操作
  • AIP-133 标准方法:Create
  • 一文读懂DeepSeek-R1论文
  • 游戏引擎分层架构与总体管线
  • 蓝桥杯python语言基础(4)——基础数据结构(上)