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

【代码随想录day 30】 力扣 763. 划分字母区间

视频讲解:https://www.bilibili.com/video/BV18G4y1K7d5/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/0763.%E5%88%92%E5%88%86%E5%AD%97%E6%AF%8D%E5%8C%BA%E9%97%B4.html#%E6%80%9D%E8%B7%AF
力扣题目:https://leetcode.cn/problems/partition-labels/

这道题我也做出来了,但是思想很麻烦:

  1. 统计多少字母并且其起始位置
  2. 按起始顺序升序排列
  3. 找到第一个存在的数组开始遍历,如果和前一个有交集,upper取max。
  4. 如果没有交集,upper即为截断点,lower和upper更新。

但是卡哥的思想就很简洁,不用考虑起始位置,只需要考虑右边界的最大值即可,
5. 每次遍历取最大值的右边界
6. 如果i 遍历到了右边界就说明该截断了,这里很精妙***
7. 存入截断值,更新left,right在每次更新数的时候会更新,所以不用更新

class Solution {
public:vector<int> partitionLabels(string s) {int hash[27] = {0};vector<int> result;//遍历字符串统计最远值for(int i = 0; i < s.size(); ++i){hash[s[i] - 'a'] = i;}//初始化左右边界int left = 0;int right = 0;for(int i = 0; i < s.size(); ++i){//每次遍历取右边界最大值right = max(right, hash[s[i] - 'a']);//如果遍历到最大值时候说明该截断了if(i == right){result.push_back(right - left + 1);left = i + 1;//right = hash[i];}}return result;}
};

这里是我的代码,虽然可以运行但是比较繁琐随便参考一下好了

class Solution {
public:static bool cmp(const vector<int>& a, const vector<int>& b) {// if(a[0] == b[0]);// 按起始位置升序排序return a[0] < b[0];}vector<int> partitionLabels(string s) {vector<vector<int>> index(26, vector<int>(2, -1));vector<int> result;// 遍历字符串s,统计其有什么字母以及字母的起始位置for (int i = 0; i < s.size(); ++i) {// 如果index中的第i个元素的起始位置为-1,说明还没有统计过这个字母的起始位置,将起始位置设为iif (index[s[i] - 'a'][0] == -1) {index[s[i] - 'a'][0] = i;}// 将该字符的终止位置更新为iindex[s[i] - 'a'][1] = i;}// 将index按起始位置排序sort(index.begin(), index.end(), cmp);int start = 0;int lower;int upper;if (index[0][0] != -1) {lower = index[0][0];upper = index[0][1];}/*for(int i = 1; i < index.size(); ++i){cout << index[i][0] << ' ' << index[i][1] << endl;}*/for (int i = 1; i < index.size(); ++i) {// 如果找到第一个不是-1的数组if (index[i][0] != -1 && index[i - 1][0] == -1) {lower = index[i][0];upper = index[i][1];}// 如果该数组存在且起始位跟上一个有交集,扩大upper取maxif (index[i][0] != -1 && index[i][0] < upper) {upper = max(upper, index[i][1]);}// 如果该数组起始位没有交集,存入切割点,更新lower和upperif (index[i][0] > upper) {result.push_back(upper - lower + 1);lower = index[i][0];upper = index[i][1];}if (i == index.size() - 1) {result.push_back(upper - lower + 1);}}return result;}
};
http://www.dtcms.com/a/432307.html

相关文章:

  • 网站百度忽然搜索不到模板制作方法
  • 上海电子通科技网站建设网页设计制作是干什么的
  • 科普:Python 中`str.join(iterable)` 方法用于逻辑连接
  • php网站模板外贸怎样做网站
  • 网站效果图设计思路网页设计尺寸的分辨率
  • 南京汽车 企业 网站建设网站建设做网站怎么做
  • 如何把网站和域名绑定网站备案号 脱离服务商
  • 陕西煤化建设集团铜川分公司网站判断网站开发语言
  • 光子计算突破:3ns超低延迟AI加速器精读分析:自然《一种具有超低延迟的大规模集成光子加速器》
  • 烟台网站建设精通臻动传媒h5网站建设机构
  • 无锡电子商务网站建设哈尔滨响应式网站建设公司
  • 网站免费推广策划方案网站开发PHP程序员招聘
  • 哈尔滨市网站建设集宁做网站
  • 全国培训加盟网站建设wordpress 单栏模板下载
  • ZYNQ7045芯片中UART实现RS422通信详解,50000字解析,C语言,嵌入式开发,软件开发
  • 网站开发综合技能实训心得体会怎么做网站文字图片
  • Linux二进制查看工具——hexdump
  • 东莞微网站建设报价电信宽带做网站服务器吗
  • 如何在网站做淘宝页面企业网站开发介绍
  • 做自己的网站的好处系统优化因素
  • 吴江建设局网站打不开了职业教育培训网站
  • 泉州企业自助建站系统简单的网页设计作品模板
  • 浔川 AI 翻译 v7.0正式上线公告
  • 网站蓝色和红色搭配单页网站cpa虚拟主机
  • asp做企业网站很好啊wdlinux 默认网站
  • 网站建设续费多少钱怎样用vps做网站
  • CLion实现log日志系统
  • Linux-03_01(Linux实用操作)
  • [温习C/C++]C++刷题技巧—字符串查找find、find_if、find_first_of和find_last_of
  • 网站空间可以自己买吗wordpress4.9免登陆发布接口