LeetCode每日1题--763. 划分字母区间

94 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情

前言

算法的重要性不言而喻!区分度高!

现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。

说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!

提前入门学习书籍:CPrimerPlus、大话数据结构

image-20220705103735001

刷题网站

代码随想录 (programmercarl.com)

leetcode

我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以

刷题嘛,最重要的就是坚持了!!!

画图软件

OneNote

这个要经常用,遇见不懂的流程的话就拿它画一画!

笔记软件

Typoral

题目

leetcode.cn/problems/pa…

image.png

解析

和之前一样,我们直接来看解析怎么写的

image.png

看过图之后就知道题目说的啥意思了,同一字母最多出现在一个片段中意思就是说找字母的最远边界。比如字符串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数组记录的就是字符最后出现的位置

image.png

如上图,这样我们就知道字符串中每个字符出现的最后位置了

下面这个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;
    }
}