ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode 763. Partition Labels 划分字母区间(中等)

2022-07-28 22:06:33  阅读:188  来源: 互联网

标签:子串 Partition last cArr 763 字母 Labels 位置 字符串


一、题目大意

标签: 贪心

https://leetcode.cn/problems/partition-labels

字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。

示例:

输入:S = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。

提示:

  • S的长度在[1, 500]之间。
  • S只包含小写字母 'a' 到 'z' 。

二、解题思路

一个字符串S,将其尽可能多的分割为子字符串,条件是每种字符最多只能出现在一个子串中。上面的示例中,字符串S中有多个a,这些a必须只能在第一个子串中,字母e出现在第二个子串中。这道题难点就是如何找到字符串的断点,即拆分成为子串的位置。观察上述例子,一旦某个字母多次出现,那么其最后一个出现位置必须要在当前子串中,字母a,e,j分别是三个子串中的结束字母。所以我们关注的是每个字母最后的出现位置,我们可以使用一个Map来建立字母和其最后出现位置之间的映射,建立好映射之后,就需要开始遍历字符串S,我们维护一个start变量,是当前子串的起始位置,还有一个last变量,是当前子串的结束位置,每当我们遍历到一个字母,需要在Map中提取出其最后一个位置,因为一旦当前子串饮食了一个字母,其必须饮食所有的相同字母,所以我们要不停的用当前字母的最后一个位置来更新last变量,只有当i和last相同了,即i=last时,当前子串饮食了所有已出现过的字母的最后一个位置,即之后的字符串不会有之前出现过的字母了,此时就应该是断开的位置,我们将子串长度加入到结果中。

三、解题方法

3.1 Java实现

public class Solution {
    public List<Integer> partitionLabels(String s) {
        Map<Character, Integer> map = new HashMap<>();
        char[] cArr = s.toCharArray();
        for (int i = 0; i < cArr.length; i++) {
            map.put(cArr[i], i);
        }

        List<Integer> res = new ArrayList<>();
        int start = 0;
        int last = 0;
        for (int i = 0; i < cArr.length; i++) {
            last = Math.max(map.get(cArr[i]), last);
            if (i == last) {
                res.add(last - start + 1);
                start = last + 1;
            }
        }

        return res;
    }
}

四、总结小记

  • 2022/7/28 把思路理清了,代码就顺理成章出来了

标签:子串,Partition,last,cArr,763,字母,Labels,位置,字符串
来源: https://www.cnblogs.com/okokabcd/p/16530397.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有