leetcode 763划分字母区间

简介: leetcode 763划分字母区间

划分字母区间

bf8dc6f7edca40f89e00c3d758f238b9.png题意简述为

即最多能切多少段?使得同一字母都出现在一个片段,且片段最多。

思路

先统计整个字符串的map字典。

然后再次遍历字符串,当遍历字符串某一点时,当前字符串区间出现的字母个数就是整个字符串的字母个数(即当前字符串区间出现的字母,全部都出现在这里,区间外没有这个字母再次出现了),纪录当前区间是一段。

class Solution {
public:
    vector<int> partitionLabels(string s) {
        map<char,int> my_map; //整个字符串字典
        map<char,int> my_map_tmp;// 一段的字典
        vector<int> result;
        int start = 0; //段开始标志
        for(int i=0 ; i< s.size() ; i++) my_map[s[i]]++;
        // for(auto it:my_map) cout<<it.first<<' '<<it.second<<endl;
        for(int i=0 ; i<s.size() ;i++)
        {
            my_map_tmp[s[i]]++; //更新一段的字典
            //检查当前的字典和全局字典,字母出现的次数
            for(auto it = my_map_tmp.begin() ; it != my_map_tmp.end() ;it++)
            {
              //当前段中字母出现个数和全局不同(即还有字母没发现),跳出
                if( it->second != my_map[it->first]) break;
                //当前段出现的字母,字母数量和全局数量都相同(即全发现)
                if(it == -- my_map_tmp.end() ) //遍历到最后一个字母都没跳出
                {
                    result.push_back(i-start+1); //记录段长度
                    start = i+1; //下一段开始点
                    my_map_tmp.clear();//清空段字典
                }
            }
        }
        return result;
    }
};

二刷

class Solution {
public:
    vector<int> partitionLabels(string s) {
        map<char,int> my_map;
        vector<int> result;
        int left=0,right =0;
        for(int i=0 ; i<s.size() ;i++)
        {
            my_map[s[i]] = i; 
        }
        // for(auto it:my_map)
        // {
        //     cout<<it.first<<' '<<it.second<<endl;
        // }
        for(int i=0 ; i<s.size() ;i++)
        {
            right = max(right,my_map[s[i]]);
            if(right==i)
            {
                result.push_back(right-left+1);
                left = i+1;
            }
        }
        return result;
    }
};


相关文章
|
3天前
|
算法 测试技术 C#
【单调栈】LeetCode2030:含特定字母的最小子序列
【单调栈】LeetCode2030:含特定字母的最小子序列
|
3天前
leetcode代码记录(第一个出现两次的字母
leetcode代码记录(第一个出现两次的字母
11 2
|
3天前
leetcode代码记录(有效的字母异位词
leetcode代码记录(有效的字母异位词
10 1
|
3天前
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
3天前
【力扣】1832.判断句子是否为全字母句
【力扣】1832.判断句子是否为全字母句
|
3天前
leetcode热题100. 字母异位词分组
leetcode热题100. 字母异位词分组
18 0
|
3天前
|
Java
LeetCode-电话号码的字母组合-Java
电话号码的字母组合-Java
15 0
|
3天前
|
算法
LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数
LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数
29 0
|
3天前
代码随想录Day30 贪心05 LeetCode T435无重叠区间 T763划分字母区间 T56 合并区间
代码随想录Day30 贪心05 LeetCode T435无重叠区间 T763划分字母区间 T56 合并区间
32 0
|
3天前
|
算法 测试技术 C#
【单调栈】【区间合并】LeetCode85:最大矩形
【单调栈】【区间合并】LeetCode85:最大矩形