zoukankan      html  css  js  c++  java
  • LeetCode 763. Partition Labels

    https://leetcode.com/problems/partition-labels/description/

    A string S of lowercase letters is given. We want to partition this string into as many parts as possible so that each letter appears in at most one part, and return a list of integers representing the size of these parts. 

    Example 1:

    Input: S = "ababcbacadefegdehijhklij"
    Output: [9,7,8]
    Explanation:
    The partition is "ababcbaca", "defegde", "hijhklij".
    This is a partition so that each letter appears in at most one part.
    A partition like "ababcbacadefegde", "hijhklij" is incorrect, because it splits S into less parts.

    Note:

    1. S will have length in range [1, 500].
    2. S will consist of lowercase letters ('a' to 'z') only.

    • 字符串中等题。滑动窗口+贪心。时间复杂度O(N),空间复杂度O(N)。
    • 首先依然是做hash,不过这次是对所有char记录它们最后出现的位置。
    • 然后定义三个指针,window开始left和结束right,当前i。每次移动i,然后判断当前S[i]最后出现的位置是否大于当前right,如果是,则扩展right为last[S[i]]。
    • 如果当前i == window结束right,则代表当前window中所有的字符都只在当前window中出现。所以可以把当前window的size记录。同时移动left到下一个window的起点。
    • https://leetcode.com/problems/partition-labels/solution/
     1 //
     2 //  main.cpp
     3 //  LeetCode
     4 //
     5 //  Created by Hao on 2017/3/16.
     6 //  Copyright © 2017年 Hao. All rights reserved.
     7 //
     8 
     9 #include <iostream>
    10 #include <vector>
    11 #include <unordered_map>
    12 using namespace std;
    13 
    14 class Solution {
    15 public:
    16     vector<int> partitionLabels(string S) {
    17         vector<int> vResult;
    18         
    19         // corner case
    20         if (S.empty()) return vResult;
    21         
    22         unordered_map<char, int> last;
    23         
    24         // the last occurred index of S[i]
    25         for (int i = 0; i < S.size(); ++ i)
    26             last[S.at(i)] = i;
    27         
    28         // start and end of the current window
    29         int left = 0, right = 0;
    30         
    31         // current pointer
    32         for (int i = 0; i < S.size(); ++ i) {
    33             right = max(right, last[S.at(i)]); // maximum index of the current window
    34             
    35             // reach the end of current window
    36             if (i == right) {
    37                 vResult.push_back(right - left + 1); // size of the current window
    38                 left = i + 1; // move to start of the next window
    39             }
    40         }
    41         
    42         return vResult;
    43     }
    44 };
    45 
    46 int main(int argc, char* argv[])
    47 {
    48     Solution    testSolution;
    49     
    50     vector<string>  inputs = {"", "ababcbacadefegdehijhklij", "abcdefg", "aaaaaaaaaa"};
    51     vector<int>     result;
    52     
    53     /*
    54      
    55      9 7 8
    56      1 1 1 1 1 1 1
    57      10
    58      */
    59     for (auto input : inputs) {
    60         result = testSolution.partitionLabels(input);
    61         
    62         for (auto it : result)
    63             cout << it << " ";
    64         cout << endl;
    65     }
    66 
    67     return 0;
    68 }
    View Code
  • 相关阅读:
    10.3 noip模拟试题
    9.30 noip模拟试题
    9.29 奶牛练习题
    9.29noip模拟试题
    9.28noip模拟试题
    9.27 noip模拟试题
    二维数据结构学习
    9.26 noip模拟试题
    ContentProvider ContentResolver ContentObserver 内容:提供、访问、监听
    Cursor 游标
  • 原文地址:https://www.cnblogs.com/pegasus923/p/8444070.html
Copyright © 2011-2022 走看看