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

每日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.dtcms.com/a/80722.html

相关文章:

  • vue3中如何实现路由导航跳转
  • [数据结构]排序之 归并排序(有详细的递归图解)
  • Python 监听模式(Observer Pattern)
  • Java面试黄金宝典6
  • 【Android性能】Systrace分析
  • 前后端联调解决跨域问题的方案
  • 洛谷题目: P1225 黑白棋游戏 题解 (本题难)
  • Android Compose 框架基础按钮模块深度剖析(四)
  • 吴恩达机器学习笔记复盘(七)多元线性回归模型
  • 可视化操作界面,工程项目管理软件让复杂项目管理变简单
  • FPGA multiboot 方案
  • WIFI p2p连接总结
  • jenkins安装部署实现自动化构建
  • 【软件工程】02_软件生命周期模型
  • nginx 简单实践:负载均衡【nginx 实践系列之四】
  • Java后端开发技术详解
  • fontTools工具的使用介绍
  • 浅分析 PE3R 感知高效的三维重建
  • LeetCode[242]有效的字母异位词
  • 【Linux】Windows 客户端访问 Linux 服务器
  • 解释什么是受控组件和非受控组件
  • VSTO(C#)Excel开发11:自定义任务窗格与多个工作簿
  • Chapter 4-15. Troubleshooting Congestion in Fibre Channel Fabrics
  • 游戏盾是什么?如何为在线游戏保驾护航?
  • 【Qt】QWidget属性2
  • FastAPI WebSocket 无法获取真实 IP 错误记录
  • Redis 跳表原理详解
  • CSV文件格式
  • 深度学习中的“刹车”:正则化如何防止模型“超速”
  • 用Promise实现ajax的自动重试