모든 영숫자를 무시할 수 있기 때문에 지금부터는 문자열에 괄호 만 포함되어 있다고 가정합니다. 질문에서와 같이 한 종류의 괄호 "()"만 있습니다.
균형 괄호를 더 이상 제거 할 수 없을 때까지 균형 괄호를 계속 제거하면 나머지 모든 괄호는 "))…) ((… (", 모든 불균형 괄호입니다. 그 전에 불균형 종료 괄호 만 있고 그 후에 불균형 여는 괄호 만 있습니다.
알고리즘은 다음과 같습니다. 간단히 말해서, 전환점을 먼저 계산합니다. 그런 다음 추가 닫는 괄호를 출력하여 문자열을 시작점에서 오른쪽으로 전환점까지 스캔합니다. 대칭 적으로 추가 오프닝 괄호를 출력하여 전환점까지 끝에서 왼쪽으로 스캔합니다.
str
엔
초기화하십시오 turning_point=0, maximum_count=0, count=0
. 각각 i
에서 다음 0
을 n-1
수행하십시오.
- 인 경우
str[i] = ')'
1에 1을 추가하십시오 count
. 그렇지 않으면 1을 빼십시오.
- 만약
count > maximum_count
설정 turning_point=i
하고 maximum_count=count
.
이제 turning_point
전환점의 색인입니다.
리셋 maximum_count=0, count=0
. 각각 i
에서 다음 0
을 turning_point
수행하십시오.
- 인 경우
str[i] = ')'
1에 1을 추가하십시오 count
. 그렇지 않으면 1을 빼십시오.
- 인 경우을
count > maximum_count
설정하십시오 maximum_count = count
. i
불균형 닫는 괄호의 색인으로 출력 합니다.
리셋 maximum_count=0, count=0
. 각각의 경우 i
에서 n-1
에 turning_point+1
아래로 다음을 수행하십시오.
- 인 경우
str[j] = '('
1에 1을 추가하십시오 count
. 그렇지 않으면 1을 빼십시오.
- 인 경우을
count > maximum_count
설정하십시오 maximum_count = count
. i
불균형 여는 괄호의 색인으로 출력 합니다.
O ( n )O ( 1 )O ( 유 )유
위의 알고리즘을 분석하면 실제로 전환점을 찾아 사용할 필요가 없다는 것을 알 수 있습니다. 모든 언밸런스 드 닫는 괄호가 흥미롭지 만 모든 언밸런스 드 여는 괄호가 무시되기 전에 발생한다는 훌륭한 관찰.
여러 테스트 결과를 보려면 "실행"을 누르십시오.
연습 1. 위의 알고리즘이 나머지 카디널리티가 균형을 이루도록 카디널리티가 가장 적은 괄호 세트를 출력 함을 보여줍니다.
문제 1. 문자열에 "() []"와 같은 두 종류의 괄호가 포함 된 경우 알고리즘을 일반화 할 수 있습니까? 새로운 상황, 인터리빙 사례 "([)]"를 인식하고 처리하는 방법을 결정해야합니다.