感觉智商又回来了(松气)。
方法大概是先建立哈希表遍历数组记录每一个字母位置的跨度,然后再遍历数组,每次遇到跨度大于目前长度的字母,就将目前长度延申跨度的长度,然后继续遍历,知道位置已经到长度了,就将长度放入结果容器,将长度重置为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;}
};