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

leetcode 408周赛 3234. 统计 1 显著的字符串的数量

3234. 统计 1 显著的字符串的数量

题目描述

给你一个二进制字符串 s

请你统计并返回其中 1 显著 的子字符串的数量。

如果字符串中 1 的数量 大于或等于 0 的数量的 平方,则认为该字符串是一个 1 显著 的字符串 。

思路

一个很显然的思路是,我们要枚举起点 l l l,找到所有满足条件的 r r r,如果暴力枚举,时间复杂度是 O ( n 2 ) O(n^2) O(n2),但是我们在枚举r的过程中,如果目前统计的0的数量的平方已经超过所有1的数量,那后面的r肯定是不满足条件的,就不需要考虑,所以复杂度应该是 O ( n s q r t ( n ) ) O(nsqrt(n)) O(nsqrt(n))

写起来极其麻烦

class Solution {
public:int numberOfSubstrings(string s) {int n = s.size();s = ' ' + s;vector<int>pre0(n + 2), pre1(n + 2);vector<int>pos;for(int i = 1; i <= n; ++i){pre0[i] = pre0[i - 1] + (s[i] == '0' ? 1 : 0);pre1[i] = pre1[i - 1] + (s[i] == '1' ? 1 : 0);if(s[i] == '0')pos.push_back(i);}pre0[n + 1] = pre0[n];pre1[n + 1] = pre1[n];pos.push_back(n + 1);int ans = 0;for(int i = 1; i <= n; ++i){//枚举起点int id = lower_bound(pos.begin(), pos.end(), i + 1) - pos.begin();//找到下一个0的位置int pre_id = i - 1;int num0 = s[i] == '0';for(int j = id; j < pos.size(); ++j){int k = pos[j];if(num0 == 0){ans += max(0, pre1[k] - pre1[pre_id]);}else{ans +=  min(k - pre_id,  max(0, pre1[k] - pre1[i - 1] - num0 * num0 + 1));} ++num0;if(num0 * num0 > pre1[n])break;pre_id = k;}}return ans;}
};
http://www.lryc.cn/news/409460.html

相关文章:

  • 容器对比虚拟机有哪些不足?
  • C# 归并排序
  • 【请求代理】springboot单机服务基于过滤器Filter实现第三方服务器接口请求代理功能
  • .NET Core异步编程与多线程解析:提升性能与响应能力的关键技术
  • Photoshop(PS) 抠图简单教程
  • 项目管理中的常用工件(二):可视化工件
  • Git入门与实战:版本控制的艺术
  • [Mysql-DML数据操作语句]
  • Tableau入门|数据可视化与仪表盘搭建
  • API 技术开发分享:连接电商平台数据获取的桥梁
  • 区块链如何助力数字版权保护和内容创作者的权益?
  • 记一次老旧项目的整体技术升级
  • 2024年最受欢迎的五大上网审计设备和软件
  • sed利用脚本处理文件
  • 泰山派RK3566开发板800x1280MIPI屏设备树补丁
  • informer中的indexer机制的实现分析与源码解读
  • 英特尔宣布针对对Llama 3.1进行优化 以提升所有产品的性能
  • Python3网络爬虫开发实战(1)爬虫基础
  • Redis的五种数据类型与命令
  • RocketMQ的详细讲解(四种mq的对比(activeMq、rabbitmq、rocketmq、kafka))
  • 除了GPT,还有哪些好用的AI工具?
  • 04 | 深入浅出索引(上)
  • Linux的yum源安装MySQL5.7
  • 基于深度学习的音频自监督学习
  • 用uniapp 及socket.io做一个简单聊天app1
  • 在Postman中引用JS库
  • 学习笔记-系统框图简化求传递函数公式例题
  • postgrsql——事务概述
  • 1.Spring Boot 简介(Spring MVC+Mybatis-plus)
  • 《计算机网络》(学习笔记)