カッコを回転[スタック/キュー]


かっこを回転

🔍 問題の説明


  • 次の規則に従う文字列は、有効なカッコ文字列として定義されます.
  • ()、[]および{}は有効なカッコ文字列です.
  • Aが有効な括弧文字列である場合、(A)、[A]および{A}も有効な括弧文字列である.たとえば、[]は有効な括弧文字列であり、([])も有効な括弧文字列である.
  • A、Bが有効な括弧文字列であれば、ABも有効な括弧文字列である.たとえば、{}および([])は有効なカッコ文字列であり、{}([])も有効なカッコ文字列です.

  • sをx(0≦x<(sの長さ)格子に左に回転すると、solution関数を完了し、sを正しいカッコ文字列にするxの個数を返します.
  • sの長さは1または1000以上です.
  • >入力
    대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 

    ▼▼▼トラブルシューティング方法

    - '(', '[', '{' : 스택에 push
    
    - 나머지 경우(')', ']', '}')
    	- 스택이 비었는지(짝의 개수가 맞지않는 경우)
    	- 같은 경우인지(짝의 모양이 맞지않는 경우)
      를 제외한 경우에만 answer(올바른 괄호 모양)값을 증가시켜준다.      
      
    - 왼쪽으로 한 칸씩 땡기기

    📃 コード#コード#


    [2021.04.28]
    #include <string>
    #include <vector>
    #include <stack>
    
    using namespace std;
    
    int solution(string s) {
        int answer = 0, size = s.size();
        while(size--) {
            bool exit = true;
            stack<char> a;
    
            for (int i = 0; i < s.size(); i++) {
                if (s[i] == '(' || s[i] == '{' || s[i] == '[') a.push(s[i]);
                else {
                    if (a.empty()) {
                        exit = false;
                        break;
                    }
                    switch (s[i]) {
                    case ')':
                        if (a.top() == '(') a.pop();
                        else exit = false;
                        break;
                    case '}':
                        if (a.top() == '{') a.pop();
                        else exit = false;
                        break;
                    case ']':
                        if (a.top() == '[') a.pop();
                        else exit = false;
                        break;
                    }
                }
                if (!exit) break;
            }
            if (a.empty() && exit) answer++;
            char b = s[0];
            s = s.substr(1, s.size() - 1) + b;
        }
        return answer;
    }

    回転を一つ一つ仕上げて、時間の複雑さはあまりよくありません.より良い方法を見つける