763. 划分字母区间

admin2024-08-25  4

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。

注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s

返回一个表示每个字符串片段的长度的列表。

 

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

示例 2:

输入:s = "eccbbbbdec"
输出:[10]

提示:

  • 1 <= s.length <= 500
  • s 仅由小写英文字母组成

763. 划分字母区间 - 力扣(LeetCode)

class Solution {
    /**
    2024年8月25日12:56:44
    第一遍遍历的时候,用map记录下每个字符的最大下标;
    第2遍遍历的时候,更新当前片段的最大下标位置,如果i到了这个位置,
    这个片段结束了,把这个片段的长度放到结果数组里
     */
    public List<Integer> partitionLabels(String s) {
        // 每个字符出现的最大下标
        Map<Character,Integer> cMap=new HashMap<>();
        for(int i=0;i<s.length();i++){
            cMap.put(s.charAt(i),i);
        }
        // 当前片段起始下标
        int start=0;
        // 当前片段最大下标范围,闭区间
        int currentLimit=0;
        List<Integer> res=new ArrayList<>();
        for(int i=0;i<s.length();i++){
            currentLimit=Math.max(cMap.get(s.charAt(i)),currentLimit);
            // 到达当前片段的最大下标 或者 到数组最后一个字符了,就可以结束了
            if(i==currentLimit || i>=s.length()-1){
                res.add(i-start+1);
                start=i+1;
            }
        }
        return res;
    }
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!