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

代码随想录 763.划分字母区间

思路:

方法一:本题无法找到局部最优推出全局最优的过程,就是用最远出现距离模拟了圈字符的行为。

1.分割字符串问题容易联想到回溯,但本题不用回溯去暴力搜索。

2.本题要求同一字母最多出现在一个片段中,在遍历过程中相当于找每一个字母的边界,找到之前遍历过的所有字母的最远边界作为分割点,此时前面出现过的所有字母,最远也就到这个边界了。

3.具体分为如下两步:

(1)统计每一个字符最后出现的位置。

(2)从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置的下标和当前下标相等了,就说明找到了分割点。

如下图所示:

附代码:

class Solution {public List<Integer> partitionLabels(String s) {List<Integer> res = new LinkedList<>();int[] edge = new int[26]; //i为字符,edge[i]为字符出现的最后位置char[] chars = s.toCharArray();for(int i = 0;i < chars.length;i ++){ //统计每一个字符最后出现的位置edge[chars[i] - 'a'] = i;}int right = 0;int last = -1;for(int i = 0;i < chars.length;i++){right = Math.max(right,edge[chars[i] - 'a']); //动态更新当前区间的最远边界if(i == right){ //如果字符最远出现位置的下标和当前下标相等,说明找到了分割点res.add(i - last); //将分割点存入结果列表last = i; //起始位置更新为当前位置(即上一个片段的最后一个元素所在位置)}}return res;}
}

方法二:思路与452.用最少数量的箭引爆气球、435.无重叠区间相同,统计字符串中所有字符的起始和结束位置,记录这些区间(实际上也就是435.无重叠区间题目里的输入),将区间按左边界从小到大排序,找到边界将区间划分成组,互不重叠,找到的边界就是答案。

附代码:

class Solution {public List<Integer> partitionLabels(String s) {int[][] partitions = findPartitions(s);List<Integer> res = new ArrayList<>();Arrays.sort(partitions,(a,b) -> Integer.compare(a[0],b[0]));int right = partitions[0][1];int left = 0;for(int i = 0;i < partitions.length;i++){if(partitions[i][0] > right){//左边界大于右边界即可记为一次分割res.add(right - left + 1);left = partitions[i][0];}right = Math.max(right,partitions[i][1]);}//最右端res.add(right - left + 1);return res;}public int[][] findPartitions(String s){List<Integer> temp = new ArrayList<>();int[][] hash = new int[26][2]; //26个字母2列,表示该字母对应的区间for(int i = 0;i < s.length();i ++){//更新字符c对应的位置ichar c = s.charAt(i);if(hash[c - 'a'][0] == 0){hash[c - 'a'][0] = i;}hash[c - 'a'][1] = i;//第一个元素区别对待一下hash[s.charAt(0) - 'a'][0] = 0;}List<List<Integer>> h = new LinkedList<>();//组装区间for(int i = 0;i < 26;i++){//if(hash[i][0] != hash[i][1]){temp.clear();temp.add(hash[i][0]);temp.add(hash[i][1]);//System.out.println(temp);h.add((new ArrayList<>(temp)));//}}int[][] res = new int[h.size()][2];for(int i = 0;i < h.size();i++){List<Integer> list = h.get(i);res[i][0] = list.get(0);res[i][1] = list.get(1);}return res;}
}

http://www.dtcms.com/a/611117.html

相关文章:

  • 网站导航包括only网站建设分析
  • 网站建站要多少钱智慧团建网站登录平台官网
  • 基于PVLIB的光伏发电量计算模型:SAPM-Sandia模型的原理与全流程解析
  • redis 在网站开发中怎么用安阳信息港网站
  • 30、【Ubuntu】【远程开发】内网穿透:反向隧道建立(二)
  • 文化厅网站建设审核报告单无锡正规网站seo公司
  • Swift中View和ViewController的生命周期
  • 网站建设是前端么网站开发的岗位及职责
  • 视频网站建设的意义论文网络营销导向网站建设的基础
  • iTwin开源包系列(二)grid组件
  • wordpress编辑器插件ueditorseo搜索引擎优化原理
  • 青岛哪家公司做网站好网站建设需求调研
  • Java线程池原理深度解析
  • AI入门知识之RAFT方法:基于微调的RAG优化技术详解
  • 怎么用word做一个网站网络企业做网站
  • 百度做网站教程房地产集团网站建设方案
  • 文心 5.0:原生全模态时代的技术分水岭
  • 多模式融合(GFS/GRAPES/ICON/GEM)在新能源预测中的对比与加权(工程版)
  • 25级第一次测试题解
  • 常用网站域名学做窗帘的网站
  • 网站制作基础教程网站建设的软件平台
  • MySQL数据库操作完全指南:从创建到管理的完整教程
  • C语言编译器在线编译 | 提供快速高效的C语言编译环境,适用于学习与开发
  • 临沂做网站的公司有哪些php网站开发难吗
  • epoll 事件全集、每个事件的含义、哪些事件在实际服务器中最常见、哪些会组合出现
  • 手机网站根目录建设银行登录网站
  • 磁共振成像原理(理论)31:基本梯度回波成像 (Basic Gradient-Echo Imaging)
  • 庐江县住房和城乡建设局网站网站建设的维护范围
  • ASC学习笔记0008:用于注册能力按键输入的回调
  • 邯郸市做网站广西远昌建设公司