Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 파티션 레이블


소문자로 된 문자열 S가 있다고 가정합니다. 각 문자가 최대 한 부분에 나타나도록 이 문자열을 가능한 한 많은 부분으로 분할하고 마지막으로 이러한 부분의 크기를 나타내는 정수 목록을 반환합니다. 따라서 문자열이 "ababcbacadefegdehijhklij"와 같으면 파티션이 "ababcbaca", "defegde", "hijhklij"이기 때문에 출력은 [9,7,8]입니다. 따라서 이것은 각 문자가 많아야 한 부분에 나타나도록 파티션입니다. "ababcbacadefegde", "hijhklij"와 같은 파티션은 S를 더 적은 부분으로 분할하기 때문에 올바르지 않습니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • cnt라는 하나의 지도 정의
  • 0에서 s 사이의 i에 대해 cnt[s[i]] :=i
  • j :=0, 시작 :=0 및 i :=0 및 n :=s의 크기
  • 하나의 배열 정의
  • 내가 인 동안
  • j :=j 및 cnt[s[i]]의 최대값
  • i =j이면 i – start + 1을 ans에 삽입하고 start :=i + 1
  • i를 1 증가
  • 반환
  • 예시(C++)

    이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

    #include <bits/stdc++.h>
    using namespace std;
    void print_vector(vector<auto> v){
       cout << "[";
       for(int i = 0; i<v.size(); i++){
          cout << v[i] << ", ";
       }
       cout << "]"<<endl;
    }
    class Solution {
    public:
       vector<int> partitionLabels(string s) {
          map <char, int> cnt;
          for(int i = 0; i < s.size(); i++)cnt[s[i]] = i;
          int j = 0, start = 0;
          int i = 0;
          int n = s.size();
          vector <int> ans;
          while(i < n){
             j = max(j, cnt[s[i]]);
             if( i == j){
                ans.push_back(i-start+ 1);
                start = i + 1;
             }
             i++;
          }
          return ans;
       }
    };
    main(){
       Solution ob;
       print_vector(ob.partitionLabels("ababcbacadefegdehijhklij"));
    }

    입력

    "ababcbacadefegdehijhklij"

    출력

    [9,7,8]