记录每日LeetCode 763.划分字母区间 Java实现

题目描述:

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

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

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

初始代码:

class Solution {
    public List partitionLabels(String s) {

    }
}

示例1:

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

示例2:

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

参考答案:

class Solution {
    public List partitionLabels(String s) {
        List list = new ArrayList<>();
        // 使用Hash表的唯一值增加增快效率
        Set set = new HashSet<>();
        // 定义双指针
        int left = 0;
        int right = 0;
        // 记录前一个左指针位置
        int count = 0;
        while (left < s.length()) {
            // 截取字符串进而继续遍历其中的字符
            right = s.lastIndexOf(s.charAt(left));
            for (int i = left; i < right; ++i) {
                if (!set.add(s.charAt(i))) {
                    continue;
                }
                right = Math.max(right, s.lastIndexOf(s.charAt(i)));
            }
            // 左指针位移
            left = right + 1;
            list.add(left - count);
            count = left;
        }
        return list;
    }
}

你可能感兴趣的:(leetcode,算法,职场和发展)