LeedCode 划分字母区间

题目

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

示例 1:

输入:S = "ababcbacadefegdehijhklij"

输出:[9,7,8]

解释:划分结果为 "ababcbaca", "defegde", "hijhklij"。每个字母最多出现在一个片段中。像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。

来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/partition-labels著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答及思路

    思路:先创建一个整型数组 list ,遍历字串将字母最后一次出现的信息存入数组。遍历字串,先确定子字串开始位置,如开始遍历时开始位置为0,一个子字串遍历结束后,开始位置调整为子字串结束位置+1;再确定结束位置,开始的结束位置是开始位置在数组中记录的值,在逐个遍历字串字符期间,若有字母最后出现位置超出结束位置,则更新结束位置为更大的结束位置;当遍历到结束位置,则意味着一个子字串遍历结束,记录字子串长度到集合ans中,并更新开始位置和结束位置,进行下一次子字串的遍历。

源码

class Solution {

    public List<Integer> partitionLabels(String S) {

        List<Integer> ans = new ArrayList<>();

        if(S == ""||S == null){

            return ans;

        }

        int[] list = new int[26];

        for(int i = 0;i<S.length();i++){

            list[S.charAt(i)-'a'] = i;

        }

        int first = 0;

        int end = list[S.charAt(first)-'a'];

        for(int i = 0;i<S.length();i++){

            if(i == end){

                ans.add(end-first+1);

                if(end != S.length()-1){

                    first = i + 1;

                    end = list[S.charAt(first)-'a'];

                }

            }

            if(list[S.charAt(i)-'a']>end)

                end = list[S.charAt(i)-'a'];

        }

        return ans;

    }

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。