C++の特別なバイナリ文字列
-
0と1の数は同じです
-
バイナリ文字列のすべてのプレフィックスには、少なくとも0と同じ数の1があります
ここで、特別な文字列Sがあるとします。移動とは、実際にはSの2つの連続した、空ではない特別な部分文字列を選択し、それらを交換することです。
任意の数の移動の最後に、辞書式順序で可能な最大の結果の文字列を見つける必要があります。
したがって、入力が11011000のような場合、出力は11100100になります。これは、次の理由によるものです。サブストリング「10」と「1100」が交換されます。これは、数回の移動で可能な辞書式順序で最大の文字列です。
これを解決するには、次の手順に従います-
-
関数makeLargestSpecial()を定義します。これにはsがかかります
-
ret:=空の文字列
-
文字列の配列vを定義する
-
i:=0
-
初期化j:=0、cnt:=0の場合、j
-
s[j]が'1'と同じ場合、-
-
(cntを1増やします)
-
-
それ以外の場合
-
(cntを1減らします)
-
-
cntが0と同じ場合、-
-
vの最後に「1」+makeLargestSpecial(インデックスi +1からj--i-1までのsの部分文字列)を挿入します
-
i:=j + 1
-
-
-
配列v.rを並べ替える
-
初期化i:=0の場合、i
-
ret:=ret + v [i]
-
-
retを返す
-
メインメソッドから、文字列を使用してmakeLargestSpecial()を呼び出します。
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; class Solution { public: string makeLargestSpecial(string s) { string ret = ""; vector<string> v; int i = 0; for (int j = 0, cnt = 0; j < s.size(); j++) { if (s[j] == '1') { cnt++; } else cnt--; if (cnt == 0) { v.push_back("1" + makeLargestSpecial(s.substr(i + 1, j - i - 1)) + "0"); i = j + 1; } } sort(v.rbegin(), v.rend()); for (int i = 0; i < v.size(); i++) ret += v[i]; return ret; } }; main(){ Solution ob; cout << (ob.makeLargestSpecial("11011000")); }
入力
11011000
出力
11100100
-
C++で文字列から二分木を構築する
括弧と整数で構成される文字列があるとします。その文字列から二分木を構築する必要があります。入力全体が二分木を表します。これは、0、1、または2組の括弧が後に続く整数を保持します。整数はルートの値を表し、括弧のペアには同じ構造の子二分木が含まれます。 したがって、入力が「4(2(3)(1))(6(5))」の場合、出力は[3,2,1,4,5,6](順序付き走査)になります これを解決するには、次の手順に従います- 関数solve()を定義します。これには、s、idx、が必要です。 =sのサイズの場合、- nullを返す num:=空の文字列 while(
-
C++で2つのバイナリ文字列を追加するプログラム
2進数の文字列が2つある場合、それら2つの2進数文字列を加算して得られた結果を見つけ、その結果を2進数文字列として返す必要があります。 2進数は、0または1のいずれかで表される数値です。2つの2進数を加算する際には、2進数の加算規則があります。 0+0 → 0 0+1 → 1 1+0 → 1 1+1 → 0, carry 1 入力 str1 = {“11”}, str2 = {“1”} 出力 “100” 入力 str1 = {“110”},