一、题目
二、代码
class Solution
{
public:
//一个一个字母去切割
//从第一个a到最后一个a 中间如果包含其他字母 一起寻找
//统计字母的起始位置
static bool cmp(const vector<int>& vec1,const vector<int>& vec2)
{
return vec1[0]<vec2[0];
}
vector<int> partitionLabels(string s)
{
int i;
int temp_end;
vector<int> return_vector;
vector<int> temp_vector;
vector<vector<int>> my_dictionary;
vector<vector<int>> process_dictionary;
temp_vector.push_back(-1);
temp_vector.push_back(-1);
for(i=0;i<26;i++) my_dictionary.push_back(temp_vector);
for(i=0;i<s.size();i++) //标出起始位置
{
if(my_dictionary[s[i]-'a'][0]==-1)
{
my_dictionary[s[i]-'a'][0]=i;
}
}
for(i=s.size()-1;i>=0;i--) //标出结束为止
{
if(my_dictionary[s[i]-'a'][1]==-1)
{
my_dictionary[s[i]-'a'][1]=i;
}
}
for(i=0;i<my_dictionary.size();i++)
{
if(my_dictionary[i][0]!=-1)
{
temp_vector.clear();
temp_vector.push_back(my_dictionary[i][0]);
temp_vector.push_back(my_dictionary[i][1]);
process_dictionary.push_back(temp_vector);
}
}
// for(i=0;i<my_dictionary.size();i++)
// {
// std::cout<<" "<<my_dictionary[i][0]<<" "<<my_dictionary[i][1]<<" interval ";
// }
// std::cout<<std::endl;
sort(process_dictionary.begin(),process_dictionary.end(),cmp);
// for(i=0;i<process_dictionary.size();i++) //排序后
// {
// std::cout<<" "<<process_dictionary[i][0]<<" "<<process_dictionary[i][1]<<" interval ";
// }
// std::cout<<std::endl;
temp_vector.clear();
temp_end=process_dictionary[0][1];
//std::cout<<" "<<process_dictionary.size()<<" "<<std::endl;
for(i=1;i<process_dictionary.size();i++)
{
// std::cout<<"i "<<i<<" "<<"temp_end "<<temp_end<<" "<<"process_dictionary[i][0] "<<" "<<process_dictionary[i][0]<<std::endl;
if(temp_end<process_dictionary[i][0])
{
// std::cout<<"temp_end "<<temp_end<<std::endl;
temp_vector.push_back(temp_end); //压入
temp_end=process_dictionary[i][1]; //更新
// std::cout<<"process_dictionary[i+1][1] "<<process_dictionary[i][1]<<std::endl;
}
else
{
temp_end=max(temp_end,process_dictionary[i][1]); //拓宽
}
}
temp_vector.push_back(s.size()-1);
for(i=0;i<temp_vector.size();i++)
{
if(i==0)
{
return_vector.push_back(temp_vector[0]+1);
}
else if(temp_vector.size()>=2&&i==temp_vector.size()-1)
{
return_vector.push_back(temp_vector[temp_vector.size()-1]-temp_vector[temp_vector.size()-2]);
}
else
{
if(i>=1)
{
return_vector.push_back(temp_vector[i]-temp_vector[i-1]);
}
}
}
return return_vector;
}
};