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

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

  1. 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

  2. C++のリバースビット

    符号なし数値xが1つあり、その2進表現(32ビット符号なし整数)を簡単に見つけることができるとします。私たちの仕事はビットを逆にすることです。したがって、バイナリ表現が00000000000000000000001001110100のような場合、反転されたビットは00101110010000000000000000000000になります。したがって、ビットを反転した後に実際の数値を返す必要があります これを解決するには、次の手順に従います- nが指定された数であると仮定します 答えましょう:=0 for i:=31から0: answer:=Answer OR(n AND i)、そして