划分字母区间c语言,LeetCode(#763):划分字母区间
一、前言
本题为LeetCode第763题,是一道 贪心算法 相关的算法题,难度中等。
本题链接:#763. 划分字母区间
二、题目
字符串S由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母只能出现在同一个片段中。返回一个表示每个字符串片段的长度的列表。
示例:
// 划分为"ababcbaca", "defegde", "hijhklij"
Input: S = "ababcbacadefegdehijhklij"
Output: [9, 7, 8]// 最多划分成3个片段
三、思路
这是一道求最优解的算法题,可以尝试使用贪心算法来解题。
本题中没有提供任何数组,只提供了一个字符串,可以将字符串中字符的位置、数量等信息统计成数组形式,以作为解题的数据。
将字符在字符串中最后一次出现的位置进行统计,得到每个字符c最后一次出现的位置end c;
初始化第一个片段的开始索引start = 0,结束索引end = 0;
对该字符串中的字符进行从左往右的遍历,对于每个字符c,若其最后一次出现的位置为end c ,则其片段的结束索引end一定大于等于end c,因此令end = max(end, end c);
当遍历到索引end后,当前片段结束,其长度为end - start + 1;
令start = end + 1,开始下一片段的访问;
重复上述步骤,直至遍历完字符。
四、Java代码
public class soultion {
public List partitionLabels(String S) {
// 统计字符在字符串中最后一次出现的位置
int[] positions = new int[26];
int len = S.length();
// S.charAt(i) - 97,'a'对应97,使得数组索引范围是[0,25],对应'a',...,'z'
for(int i = 0; i < len; i++) {
positions[S.charAt(i) - 97] = i;
}
List partitionLength = new ArrayList<>();
int start = 0;
int end = 0;
for(int i = 0; i < len; i++) {
end = Math.max(end, positions[S.charAt(i) - 97]);
if( i == end ) {
partitionLength.add( end - start + 1);
start = end + 1;
}
}
return partitionLength;
}
}
五、补充
/*
上面代码是官方解法,下面是我自己的解法,原理好懂但比较复杂
这解法原理和435题无重叠区间比较像
*/
public class Solution {
public List partitionLabels(String S) {
// 查询字符串中所有字符的起始和结束位置,97对应'a',122对应'z'
List positions = new ArrayList<>();
for(int i = 97; i <= 122; i++) {
if( S.indexOf(i) != -1 ) {
positions.add( new Integer[]{S.indexOf(i), S.lastIndexOf(i)} );
}
}
// 按照开始位置进行升序排序
Collections.sort(positions, Comparator.comparingInt(o -> o[0]));
int start = 0;
int end = positions.get(0)[1];
List list = new ArrayList<>();
for(int i = 1; i < positions.size(); i++) {
if( end > positions.get(i)[0]) {
end = Math.max(end, positions.get(i)[1]);
}else {
list.add( end -start + 1 );
start = end + 1;
end = positions.get(i)[1];
}
}
list.add(end - start + 1);
return list;
}
}
划分字母区间c语言,LeetCode(#763):划分字母区间相关推荐
- c语言字母g,C语言库函数(G类字母) - 1.doc
C语言库函数(G类字母) - 1 C语言库函数(G类字母) - 1 [ 永远的UNIX > C语言库函数(G类字母) - 1 ] 首页 > 编程技术 > C/C++ > 正文 ...
- LeetCode 763. 划分字母区间
文章目录 解法1:记录最大最小下标 解法2:贪心 https://leetcode-cn.com/problems/partition-labels/ 难度:中等 字符串 S 由小写字母组成.我们 ...
- 蓝桥杯 基础练习(三)字母图形 C语言
字母图形 C语言 问题描述 利用字母可以组成一些美丽的图形,下面给出了一个例子: ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC 这是一个5行7列的图形,请找出这个图形 ...
- 力扣记录:贪心算法3较难(1)区间问题——55 跳跃游戏,45 跳跃游戏II,452 用最少数量的箭引爆气球,435 无重叠区间,763 划分字母区间,56 合并区间
本次题目 55 跳跃游戏 45 跳跃游戏II 452 用最少数量的箭引爆气球 435 无重叠区间 763 划分字母区间 56 合并区间 55 跳跃游戏 局部最优:不管每次跳多少步,取最大跳跃步数,若覆 ...
- 763. 划分字母区间009(贪心算法+思路+详解+图示)
一:题目: 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中.返回一个表示每个字符串片段的长度的列表. 示例: 输入:S = "ababcba ...
- 763 划分字母区间
题目描述 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一字母最多出现 在一个片段中.返回一个表示每个字符串片段的长度的列表. 题解 贪心策略 代码 class Solutio ...
- [NBUT 1458 Teemo]区间第k大问题,划分树
裸的区间第k大问题,划分树搞起. #pragma comment(linker, "/STACK:10240000") #include <map> #include ...
- R语言连续变量等级划分
R语言连续变量等级划分 ###################等级划分######################数据读取dat <- read.csv("F:/Desktop/ccv ...
- c语言程序整数划分源代码,C语言实现整数划分问题
参照点击打开链接 1.题目描述:输入一个正数n,输出所有和为n连续正数序列. 例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5.4-6和7-8. 思路: 等差 ...
最新文章
- HA03-fence设置
- noah的前端面试题(三)|掘金技术征文
- 设备树的引入及简明教程
- JSTL标签显示分页
- pytorch实现性别检测
- 【SAP干货】创建Search Helps (Elementary and Secondary)
- java进阶08 GUI图形界面
- 学习网页栅格系统的几篇好文
- 身为程序员的父母,你年薪多少才能让“码二代” 不输在起跑线上
- CondaHTTPError: HTTP 000 CONNECTION FAILED for url ...... 解决过程
- Python金融数据挖掘 第11章 复习思考题2 (聚类)选取中华人民共和国第六次人口普查的各地区人口数以及男女比例进行K-Means聚类分析。
- PTES_Technical_Guidelines(渗透测试执行标准)
- 2023年东南大学机械工程考研考情与难度、参考书上岸前辈备考经验
- ai怎么渐变颜色_AI的渐变工具为什么如此难用?
- 修改 google chrome 背景颜色为绿豆沙
- English 英文邮件致谢的10种表达方式十种不同场合的英文表达
- Zotero 5.0 + 坚果云同步盘 + papership 配置教程
- Linux最最最常用命令!
- java中什么叫服务?
- Weisfeiler-Lehman(WL)算法