我正在解决一个关于 LeetCode.com 的问题:
给出了小写字母的字符串 S。我们希望将此字符串划分为尽可能多的部分,以便每个字母最多出现在一个部分,并返回表示这些部分大小的整数列表。
示例:
输入:S = “ababcbacadefegdehijhklij”
输出:[9,7,8]
解释:
分区是“ababcbaca”,“defegde”,“hijhklij”。这是一个分区,因此每个字母最多出现在一个部分。像“阿巴巴卡德”“hijhklij”这样的分区是不正确的,因为它将S分成更少的部分。
其中一个高度支持的解决方案如下:
public List<Integer> partitionLabels(String S) {
if(S == null || S.length() == 0){
return null;
}
List<Integer> list = new ArrayList<>();
int[] map = new int[26]; // record the last index of the each char
for(int i = 0; i < S.length(); i++){
map[S.charAt(i)-'a'] = i;
}
// record the end index of the current sub string
int last = 0;
int start = 0;
for(int i = 0; i < S.length(); i++){
last = Math.max(last, map[S.charAt(i)-'a']);
if(last == i){
list.add(last - start + 1);
start = last + 1;
}
}
return list;
}
}
虽然我确实理解解决方案,但我对声明和子句不是很满意。这里到底在做什么?last = Math.max(last, map[S.charAt(i)-'a']);if(last == i)
侃侃尔雅
LEATH
相关分类