力扣 763. 划分字母区间

力扣 763. 划分字母区间

力扣763. 划分字母区间

题目解法非常巧妙,使用for循环每次保存字母的最大索引位置,然后通过第二个for循环找每一个字母的最大索引位置是否等于当前的索引位置,如果相等,就说明是最长的区间,然后可以保存这个区间的长度,为什么可以通过 字母的最大索引位置是否等于当前的索引位置 判断是否为最长区间,我举一个例子,比如字符串 “ababcbacadefegdehijhklij”=对应的索引是

8 5 8 5 7 5 8 7 8 14 15 11 15 13 14 15 19 22 23 19 20 21 22 23

把待划分区间的右边界right设置为当前字母的最大索引位置和right二者中较大的那一个,如果遇到字母的最大索引位置比right小,就说明这个区间应该更长。题目的这句话 “同一字母最多出现在一个片段中 ”很关键,这说明每一个区间中可以包含很多索引比较小的字母,所以要找到最大的字母下标。

我感觉说的不太清晰,还是看代码

class Solution {
    public List<Integer> partitionLabels(String s) {
        ArrayList<Integer> arr=new ArrayList<>();
        int[] map=new int[27];
        int left=0, right=0;
        for(int i=0; i<s.length(); i++){
            map[s.charAt(i)-'a']=i;
        }
       
        for(int i=0; i<s.length(); i++){
            right=Math.max(map[s.charAt(i)-'a'], right);
            if(right==i){
                arr.add(right-left+1);
                left=i+1;
            }
        }
        return arr;
    }
}

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注