2017-03-17 3 views
-1

에 중복/잘못된 괄호를 제거 : 결과Python. 어떻게 예를 들어, 입력 문자열의 경우 문자열

s = "fo)o)fus()(bar((em)ro(em))dah((y(XXX)"

를 나는 기대 : 그것은 결과처럼

fus()((em)ro(em))dah(XXX)

모든 "건강한"블록을 포함해야 , 그들 사이에 열린 "("및 닫힌 ")"+ "건강한"텍스트가 있습니다. "()"에 관여하지 않고 "()"사이에 없거나 "()"에 포함되어 있지 않기 때문에 모든 아픈 부분을 제거해야합니다 (0123) 검사 예 :

z = "))(OMG)123(()qwe(zxc)(ll"

(OMG)123()qwe(zxc)

나는 그것이해서 같은 re 모듈로 해결 될 수 있다는 것이다 반환해야합니다. 하지만 어떤 알고리즘을 사용해야하는지 잘 모르겠습니다.

추신 : 나는 어떤 도움도 거부하지 않을 것입니다. :)

+0

지금까지 무엇을 생각해 냈습니까? – Jan

+0

나는 괄호를 숫자를 증가/감소시키고, 인덱스로 매핑하고, 포함되어야하는 부분을 얻으려고 노력했다. ) fus() bar ((em) ro (em)) dah ((y (XXX)) -1 -2 -1 -2 -1 0 1 0 1 0 -1 -2 -1 0 1 0 –

+0

그리고 역방향 모드로 이동하는 경우 : 색인이 x에서 x + 1로 증가 할 때 -> 추가해야합니다. 그렇지 않으면 -> –

답변

1

스택을 사용하는 데 대한 좋은 예가 있으며 거의 ​​모든 CS 학생이이 문제를 적어도 한 번 해결했습니다. 예를 들어 this을 확인하십시오. 그러나 더 나은 구문 (특히 C++ 용으로 작성된 구문)을 찾을 수 있습니다.

이러한 솔루션은 일반적으로 문이 정확한지 확인하는 데 사용되지만 동일한 논리를 사용하여 잘못된 부분을 제거하고 일치하는 문구 만 저장하면됩니다. 그래서 그냥 새로운 문자열 변수 (variable="")를 만들고, 문자열을 반복하고, 괄호를 확인하십시오. 올바른 위치에 있으면 변수에 추가하십시오. 괄호 순서를 검사하려면 Stack 객체를 사용합니다. 괄호를 열면 스택에 밀어 넣은 다음 스택을 닫고 스택에서 마지막 값을 팝합니다 (새 항목은 )이고 스택의 마지막 항목입니다). (이어야합니다. 일치하지 않으면 그 부분을 버리고 계속해서 일치하면 해당 부분을 문자열에 추가하십시오.

+0

흠 ... 좋은 단서. –

+0

주 변수에 추가하기 전에 임시 문자열을 만드는 경우''(abc "'? –

+1

@EricDuminil 예, 그렇습니다.이 경우 루프가 괄호로 표시되고 괄호가 없으면 temp가 추가되지 않습니다. 주요 문자열 그래서 문제가 해결 될 것입니다. 그래서 아이디어는 괄호 사이의 모든 문자열을 임시로 수집하고 괄호가 닫히고 주 문자열, 청소 온도 및 루프를 계속합니다. –