32. 최 장 괄호

2054 단어
제목 은 '(' 와 ')' 만 포함 하 는 문자열 을 지정 하고 가장 긴 괄호 를 포함 하 는 하위 문자열 의 길 이 를 찾 습 니 다.
예제 1: 입력: "()" 출력: 2 설명: 최 장 유효 괄호 문자열 은 "()" 입 니 다.
예제 2: 입력: ") ()" 출력: 4 설명: 가장 길 고 유효한 괄호 문자열 은 "() ()" 입 니 다.
사고 문 제 는 가장 긴 괄호 서열 을 구 하 는 것 으로 스 택 이라는 데이터 구 조 를 사용 하 는 것 을 쉽게 생각 할 수 있다.기본 적 인 사 고 는 하나의 스 택 을 유지 하고 왼쪽 괄호 를 만나면 스 택 에 들 어가 고 오른쪽 괄호 를 만나면 스 택 에서 나 오 며 현재 합 법 적 인 서열 이 가장 긴 서열 인지 판단 하 는 것 이다.그러나 이 문 제 는 생각 이 간단 해 보이 지만 까다 로 운 테스트 집 이 많다.구체 적 으로 말 하면 주요 문 제 는 오른쪽 괄호 를 만 났 을 때 현재 의 합 법 적 인 서열 의 길 이 를 어떻게 판단 하 느 냐 하 는 것 이다.비교적 건장 한 방식 은 다음 과 같다. (1) 현재 스 택 이 비어 있 으 면 현재 오른쪽 괄호 가 합 법 적 인 서열 이 없다 는 것 을 의미한다.(2) 그렇지 않 으 면 스 택 상단 요 소 를 팝 업 합 니 다. 팝 업 후 스 택 이 비어 있 으 면 현재 괄호 가 일치 하 는 것 을 설명 합 니 다. 우 리 는 합 법 적 으로 시작 하 는 출발점 start 를 유지 할 것 입 니 다. 합 법 적 인 서열 의 길 이 는 현재 요소 의 위치 - start + 1 입 니 다.그렇지 않 으 면 스 택 에 요소 가 있 으 면 현재 합 법 적 인 서열 의 길 이 는 현재 스 택 꼭대기 요소 의 위치 에서 현재 요소 의 거리 까지 입 니 다. 스 택 꼭대기 요소 뒤의 괄호 가 합 법 적 이 고 왼쪽 괄호 가 스 택 에서 나 왔 기 때 문 입 니 다.한 번 의 스 캔 만 필요 하기 때문에 알고리즘 의 시간 복잡 도 는 O (n) 이 고 공간 복잡 도 는 스 택 의 공간 이 며 최 악의 경우 모두 왼쪽 괄호 이기 때문에 O (n) 입 니 다.
#include 
#include 
#include 
using namespace std;
class Solution {
public:
    int longestValidParentheses(string s) {
        if (s.empty()) return 0;
        stack index;
        int maxCount = 0, startIndex = 0;
        for (int i = 0; i < s.length(); i++)
        {
            if (s.at(i) == '(') index.push(i);
            else
            {
                if (index.empty()) startIndex = i + 1;
                else
                {
                    index.pop();
                    if (index.empty()) maxCount = max(maxCount, i - startIndex + 1);
                    else { maxCount = max(maxCount, i - index.top()); }
                }
            }
        }
        return maxCount;
    }
};

int main(int argc, char* argv[])
{
    string s = ")()())";
    auto res = Solution().longestValidParentheses(s);
    return 0;
}

좋은 웹페이지 즐겨찾기