力扣刷题记录88.1-----763. 划分字母区间


一、题目

在这里插入图片描述

二、代码

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;
    }

};

三、运行结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@白圭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值