C++の括弧の各ペア間のサブストリングを逆にする
小文字と括弧で構成される文字列sがあるとします。一致する括弧の各ペアの文字列を、最も内側の括弧から始めて逆にする必要があります。また、結果に角かっこを含めることはできません。したがって、入力が「(hel(lowo)rld)」の場合、出力は「dlrlowoleh」になるため、最初から「(hel(lowo)rld)」→「(helowolrld)」のように変更されます。 →「dlrowoleh」。
これを解決するには、次の手順に従います-
-
n:=文字列のサイズ、長さがnのparという配列を作成し、スタックst
を定義します。 -
0からn–1の範囲のiの場合
-
s [i]が開き括弧の場合は、iをstに挿入します
-
それ以外の場合、s [i]が括弧を閉じているときは、j:=st.pop()、par [i]:=j、およびpar [j]:=i
-
-
空の文字列retを1つ定義します
-
for i:=0、d:=1、i
-
s [i]が開き括弧であるか、s [i]が閉じ括弧である場合、i:=par [i]、d:=-d、それ以外の場合はretをs [i]
増やします。
-
-
retを返す
例(C ++)
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; class Solution { public: void out(vector <int>& v){ for(int i = 0; i < v.size(); i++){ cout << v[i] << " " ; } cout << endl; } string reverseParentheses(string s) { int n = s.size(); vector <int> par(n); stack <int> st; for(int i = 0; i < n; i++){ if(s[i] == '('){ st.push(i); } else if(s[i] == ')'){ int j = st.top(); st.pop(); par[i] = j; par[j] = i; } } string ret = ""; for(int i = 0, d = 1; i < n; i += d){ if(s[i] == '(' || s[i] == ')'){ i = par[i]; d = -d; } else{ ret += s[i]; } } out(par); return ret; } }; main(){ Solution ob; cout << (ob.reverseParentheses("(hel(lowo)rld)")); }
入力
"(hel(lowo)rld)"
出力
13 0 0 0 9 0 0 0 0 4 0 0 0 0 dlrlowoleh
-
C /C++で文字列を反転します
これはC言語で文字列を逆にする例です 例 #include<stdio.h> #include<string.h> int main() { char s[50], t; int i = 0, j = 0; printf("\nEnter the string to reverse :"); gets(s); j = strlen(s) - 1; while (i < j) { &n
-
C++のリバースビット
符号なし数値xが1つあり、その2進表現(32ビット符号なし整数)を簡単に見つけることができるとします。私たちの仕事はビットを逆にすることです。したがって、バイナリ表現が00000000000000000000001001110100のような場合、反転されたビットは00101110010000000000000000000000になります。したがって、ビットを反転した後に実際の数値を返す必要があります これを解決するには、次の手順に従います- nが指定された数であると仮定します 答えましょう:=0 for i:=31から0: answer:=Answer OR(n AND i)、そして