C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++のパーティションラベル


小文字の文字列Sが指定されているとします。この文字列をできるだけ多くの部分に分割して、各文字が多くても1つの部分に表示されるようにし、最後にこれらの部分のサイズを表す整数のリストを返します。したがって、文字列が「ababcbacadefegdehijhklij」のような場合、パーティションは「ababcbaca」、「defegde」、「hijhklij」であるため、出力は[9,7,8]になります。したがって、これはパーティションであり、各文字は多くても1つの部分で発生します。 「ababcbacadefegde」、「hijhklij」のようなパーティションは、Sをより少ない部分に分割するため、正しくありません。

これを解決するには、次の手順に従います-

  • cntと呼ばれる1つのマップを定義します
  • 0からsの範囲のiの場合、cnt [s [i]]:=i
  • j:=0、start:=0およびi:=0およびn:=sのサイズ
  • 1つの配列を定義します
  • while i
  • 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]

    1. C++で配列内のパーティションポイントを検索します

      このチュートリアルでは、パーティションポイントに残されたすべての要素が小さく、パーティションポイントに右にあるすべての要素が大きい配列内のパーティションポイントを見つけます。 問題を解決するための手順を見てみましょう。 アレイを初期化します。 アレイを繰り返し処理します。 0からIまで繰り返し、各値が現在の値よりも小さいかどうかを確認します。 Iからnまで繰り返し、各値が現在の値よりも大きいかどうかを確認します。 ボットが条件を満たした場合は、値を返します。 パーティションポイントを印刷します。 例 コードを見てみましょう。 #include &

    2. C++での等しいツリーパーティション

      n個のノードを持つ二分木があるとすると、元のツリーの1つのエッジを削除した後、値の合計が等しい2つのツリーにツリーを分割できるかどうかを確認するタスクがあります。 したがって、入力が次のような場合 そうすれば、出力は真になります。 これを解決するには、次の手順に従います- 1つのスタックstを定義する 関数solve()を定義します。これはノードを取ります ノードがnullの場合、- 0を返す leftSum:=solve(ノードの左側) rightSum:=solve(ノードの権利) curr:=val + leftSum+rig