763.按字母顺序划分区间
最编程
2024-03-31 15:50:17
...
思路: 和45.跳跃游戏II的思路很像
在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。
可以分为如下两步:
- 统计每一个字符最后出现的位置
- 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点
class Solution {
public List<Integer> partitionLabels(String s) {
int[] list=new int[26];//存储字符的最远位置
char[] sList=s.toCharArray();
for(int i=0;i<sList.length;i++){//初始化最远位置数组
list[sList[i]-'a']=i;
}
List<Integer> res=new ArrayList<>();
int end=0;//这一步的最远位置
int len=0;//当前走的长度
for(int i=0;i<sList.length;i++){
len++;
end=Math.max(end,list[sList[i]-'a']);
if(i==end) {
res.add(len);
len=0;
}
}
return res;
}
}
时间复杂度:O(n)
空间复杂度:O(1),使用的hash数组是固定大小