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

代码随想录-250720-划分字母区间

划分字母区间

    题目内容

    给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。例如,字符串 "ababcc" 能够被分为 ["abab","cc"],但类似["aba","bcc"] 或 ["ab","ab","cc"] 的划分是非法的。

    注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。

    返回一个表示每个字符串片段的长度的列表。

    输入描述

    一个字符串 s

    输出描述

    一个表示每个字符串片段的长度的列表

    样例1

    输入

    ababcbacadefegdehijhklij
    

    Copy

    输出

    9 7 8
    

    Copy

    说明

    划分结果为 "���������ababcbaca"、"�������defegde"、"ℎ��ℎ����hijhklij" 。

    每个字母最多出现在一个片段中。

    像 "����������������ababcbacadefegde", "ℎ��ℎ����hijhklij" 这样的划分是错误的,因为划分的片段数较少。

    样例2

    输入

    eccbbbbdec
    

    输出

    10
    

    解答:

    从左至右记录每个字符的最大位置即可。重新遍历时如果最大位置超出范围就延长。

    时间复杂度O(n),空间复杂度O(1)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){vector<int>right(26,-1);string s;cin>>s;int n=s.size();for(int i=0;i<n;i++){right[s[i]-'a']=i;}vector<int>ans;int l=0,r=0;for(int i=0;i<n;i++){if(i<=r){r=max(r,right[s[i]-'a']);}else{ans.push_back(r-l+1);l=i;r=right[s[i]-'a'];}}ans.push_back(r-l+1);cout<<ans[0];for(int i=1;i<ans.size();i++){cout<<" "<<ans[i];}cout<<endl;return 0;
    }
    http://www.dtcms.com/a/289707.html

    相关文章:

  • 什么是 Linux 发行版?什么是 Linxu 操作系统?
  • python字符串的讲解和应用
  • kotlin Flow快速学习2025
  • Function Callingの进化路:源起篇
  • (5)从零开发 Chrome 插件:Vue3 Chrome 插件待办事项应用
  • 7.20 树hash |字典树模板❗
  • LangChain4j多模型共存+整合SpringBoot
  • springboot websocket 自动重启方案
  • SpringBoot3集成MapstructPlus
  • 抓包工具使用教程
  • 网安-文件上传-upload-labs
  • Laravel 原子锁概念讲解
  • jdk各个版本特性
  • Linux 基础文件IO操作
  • 零基础学习性能测试第一章:核心性能指标-并发量
  • Node.js 中基于请求 ID 实现简单队列(即时阻止策略/排队等待策略)
  • DMZ网络
  • (1)Windows环境下安装Oracle
  • Vue3 Proxy 数据劫持为什么比Object.defineProperty() Vue2数据劫持的性能更好
  • 人工智能训练师三级实操题第一部分数据处理
  • shell 脚本基础学习
  • Java中的intern()方法
  • 全新安装Proxmox VE启动时卡在Loading initial ramdisk
  • RAII机制以及在ROS的NodeHandler中的实现
  • 【c++】200*200 01灰度矩阵求所有的连通区域坐标集合
  • 鸿蒙开发中 渲染范围的控制
  • 飞腾D2000的BIOS编译
  • 在服务器无网络的环境下安装 VS Code Remote-SSH 组件
  • 【Python练习】053. 编写一个函数,实现简单的文件加密和解密功能
  • C++string类(3)