题目:763. 划分字母区间
思路:用哈希表sta来记录字母最后出现的位置。使用双指针来进行判断的划分。时间复杂度0(n)
C++版本:
class Solution {
public:
vector<int> partitionLabels(string s) {
//哈希表sta来记录字母最后出现的位置
int sta[30];
memset(sta,0,sizeof sta);
for(int i=0;i<s.size();i++){
sta[s[i]-'a']=i;
}
//记录划分的片段长度
vector<int> v;
//当前片段的左右端点
int l=0,r=0;
for(int i=0;i<s.size();i++){
//更新当前片段的右端点
r=max(r,sta[s[i]-'a']);
//如果已遍历到右端点
if(r==i){
//记录片段的长度
v.push_back(r-l+1);
//下一个片段的左端点
l=i+1;
}
}
return v;
}
};
JAVA版本:
class Solution {
public List<Integer> partitionLabels(String s) {
//哈希表sta来记录字母最后出现的位置
int[] sta=new int[30];
for(int i=0;i<s.length();i++){
sta[s.charAt(i)-'a']=i;
}
//记录划分的片段长度
List<Integer> answer =new ArrayList<Integer>();
//当前片段的左右端点
int l=0,r=0;
for(int i=0;i<s.length();i++){
//更新当前片段的右端点
r=Math.max(r,sta[s.charAt(i)-'a']);
//如果已遍历到右端点
if(r==i){
//记录片段的长度
answer.add(r-l+1);
//下一个片段的左端点
l=i+1;
}
}
return answer;
}
}