【力扣hot100题】(079)划分字母区间
感觉智商又回来了(松气)。
方法大概是先建立哈希表遍历数组记录每一个字母位置的跨度,然后再遍历数组,每次遇到跨度大于目前长度的字母,就将目前长度延申跨度的长度,然后继续遍历,知道位置已经到长度了,就将长度放入结果容器,将长度重置为1,起始位置重置为下一个字符,继续这些操作。
class Solution {
public:
vector<int> partitionLabels(string s) {
vector<int> result;
unordered_map<char,pair<int,int>> dictionary;
for(int i=0;i<s.size();i++){
if(dictionary.find(s[i])==dictionary.end()) dictionary[s[i]]=make_pair(i,i);
else dictionary[s[i]].second=i;
}
int start=0;
int r=1;
for(int i=0;i<s.size();i++){
if(dictionary[s[i]].second>start+r-1){
r+=dictionary[s[i]].second-start-r+1;
}
if(i+1==r+start){
result.push_back(r);
start=i+1;
r=1;
}
}
return result;
}
};
其实不需要哈希表,用一个数组记录就可以了,而且也不需要记录起始位置和跨度(写完才发现并没有用上),记录每个字母的最后一个位置就可以了。
class Solution {
public:
vector<int> partitionLabels(string s) {
vector<int> result;
int dic[26];
memset(dic,0,sizeof(dic));
for(int i=0;i<s.size();i++) dic[s[i]-'a']=i;
int start=0;
int r=1;
for(int i=0;i<s.size();i++){
if(dic[s[i]-'a']>start+r-1){
r+=dic[s[i]-'a']-start-r+1;
}
if(i+1==r+start){
result.push_back(r);
start=i+1;
r=1;
}
}
return result;
}
};