2017-03-17 191 views
-1

例如輸入字符串:Python。如何刪除多餘的/錯誤的括號中的字符串

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

因此,我預計:

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

這就像結果應該包含所有「健康」塊,它們之間打開「(」和「關閉」)「+」健康「文本。所有生病的部位應該被刪除:「fo)」和「o)」,因爲它們不涉及「()」,它們不在「()」之間或不包含在「()」中。

例如對於檢查:

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

應該返回 (OMG)123()qwe(zxc)

我會認爲它可以解決與re模塊楷書。但我不知道應該使用哪種算法。注:我不會拒絕任何幫助。 :)

+0

到目前爲止你有什麼想法? – Jan

+0

我試着翻譯括號來增加/減少數字,用索引映射它並得到應該包含的部分。 ()()(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

hm ...,好的線索我會嘗試使用它 –

+0

是否適用於'「(abc」'? –

+1

@EricDuminil是的,如果在將其添加到主變量之前創建臨時字符串,那麼當循環將會和沒有括號時,temp不會被添加到主要字符串等問題都將被解決,所以想法是將括號之間的所有字符串收集到temp中,並且當括號將被關閉時,它會將其轉換爲主字符串,清理temp並繼續循環。 –

相關問題