LeetCode 763划分字母区间 详解

题目详情

字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。

示例 1:

输入: S = "ababcbacadefegdehijhklij"
输出: [9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。

注意:

  1. S的长度在[1, 500]之间。
  2. S只包含小写字母'a''z'

题目分析

此题关键的想法就是找到能分割的条件, 对S的每个字符进行判断, 看是否此字符是被分割到另一个字符中。

通过分析题目可以知道, 要求一个字符只能出现在一个字符串里, 这里可以知道第一个条件:

  • 当此字符在前面分割的出现,就不能当做分割点

但是这个条件显然是不够的,当出现前面分割的字符串没出现的字符时, 是不是能直接加进去呢? 这是不行的
考虑分割此字符串
aaaaabcdaefgh
当判断b的时候, 首先在前面已经分好的字符串aaaaa里面没有,符合条件。所以我们把b当做新的分割点。 单着显然是错误的,因为在b后面的字符串里,出现了a, 当我们以b作为分割点的话必定有两个分割的字符串,不符合条件。 所以第二个限制条件:

  • 分割点后面不能出现前面一个字符串中的字符

综上条件我们可以得到结果

AC代码

class Solution {
public:
    vector<int> partitionLabels(string S) {
    	//分割点前的字符串的字符种类 (这里不用存一个完整的字符串,只需要存字符串出现的种类就可以)
        string contain_char = "";
        //前一个字符串的长度
        int strLen = 0;
        //返回的数组
        vector<int> re;
        
        for (int i = 0; i < S.size(); i++) {
        	//当没有字符串被分割时
            if(contain_char.size() == 0) {
                contain_char += S[i];
                strLen++;
                continue;
            } 
            
            //如果当前字母在原来的字符串里 就加入进去
            if (contain_char.find(S[i]) != string::npos) {
                strLen++;
            } else {
                //如果上一个string的包含的字符 在此字母后的string出现
                //则说明此字符不是分割的地方, 把此字符加入到string
                //而且更新contain_char
                
                bool flag = false;
                for (auto singleChar : contain_char) {
                    //后面有字符
                    if (S.find(singleChar, i+1) != string::npos) {
                        flag = true;
                    }
                }
                //如果后面有字符  就把当前字符加入到前面的字符串里
                if (flag) {
                    contain_char += S[i];
                    strLen++;
                } else {
                    contain_char = "";
                    contain_char += S[i];    
                    re.push_back(strLen);
                    strLen = 1;
                }
            }
        }
         re.push_back(strLen);
        
        return re;
        
    }
};

总结

此题利用贪心算法是我对每一个S的字符, 在能把这个字符分离的情况下。 对每一个字符进行判断, 这样得到的字符串的数目应该是最多的

原文地址:https://www.cnblogs.com/qq874455953/p/9901049.html