开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情
前言
算法的重要性不言而喻!区分度高!
现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。
说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!
提前入门学习书籍:CPrimerPlus、大话数据结构
刷题网站
我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以
刷题嘛,最重要的就是坚持了!!!
画图软件
OneNote
这个要经常用,遇见不懂的流程的话就拿它画一画!
笔记软件
Typoral
题目
解析
和之前一样,我们直接来看解析怎么写的
看过图之后就知道题目说的啥意思了,同一字母最多出现在一个片段中意思就是说找字母的最远边界。比如字符串dasdsadadfasdfdallllllllll这个字符串按照题目的要求我们可以分为两部分
dasdsadadfasdfda和llllllllll,同一字母说的可不是一个字母只能出现在一个片段中,而是多个相同的字母在一个片段!
读懂题目了,其实就是找思路解决这个问题
我们的思路是:
- 统计每一个字符最后出现的位置
- 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点
我们首先来解释下面这段代码:
List<Integer> list = new LinkedList<>();
int[] edge = new int[26];
char[] chars = S.toCharArray();
for (int i = 0; i < chars.length; i++) {
edge[chars[i] - 'a'] = i;
}
list集合为收集最终结果存放的容器
edge为边界数组,存放字符最后出现的位置
chars数组是将题目给的字符串转化为char类型的数组
下面就是对chars数组遍历,将chars数组中的字符转-'a'得到在edge数组中的索引,最后对该位置赋值
最后呢这个edge数组记录的就是字符最后出现的位置
如上图,这样我们就知道字符串中每个字符出现的最后位置了
下面这个for循环是找字符出现的最远边界的
如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点。那就把长度加起来放到list里面最后返回
for (int i = 0; i < chars.length; i++) {
idx = Math.max(idx,edge[chars[i] - 'a']);
if (i == idx) {
list.add(i - last);
last = i;
}
}
完整代码
看不懂?没办法,多写多练多总结!
还是带入代码到示例中多去总结多练习!
class Solution {
public List<Integer> partitionLabels(String S) {
List<Integer> list = new LinkedList<>();
int[] edge = new int[26];
char[] chars = S.toCharArray();
for (int i = 0; i < chars.length; i++) {
edge[chars[i] - 'a'] = i;
}
int idx = 0;
int last = -1;
for (int i = 0; i < chars.length; i++) {
idx = Math.max(idx,edge[chars[i] - 'a']);
if (i == idx) {
list.add(i - last);
last = i;
}
}
return list;
}
}