zoukankan      html  css  js  c++  java
  • 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的字符, 在能把这个字符分离的情况下。 对每一个字符进行判断, 这样得到的字符串的数目应该是最多的

  • 相关阅读:
    OSI 与 TCP/IP协议簇
    交换机工作原理
    Windows搭建域环境
    网络安全散装笔记
    Python之正则匹配——RE模块
    Django框架之ORM数据库操作
    Django中ORM的优化
    python遍历文件夹下文件
    numpy.r_ c_
    python调用google map api
  • 原文地址:https://www.cnblogs.com/qq874455953/p/9901049.html
Copyright © 2011-2022 走看看