題目大概的意思是輸入一組字串,字串包含小寫字母和『(』、『)』,保留能匹配成一對的小括號,去掉多餘的『(』或者『)』。答案可能會有多個,只需要輸出乙個正常的字串就可以。
括號匹配,我們可以使用棧的資料結構來匹配成對的括號,遇到乙個左括號『(』就入棧,如果遇到乙個右括號『)』,需要判斷棧是否為空(代表右括號前面是否有左括號跟它匹配),棧為空,那麼這個就是無效的右括號;如果遍歷完字串,棧不為空,還有左括號『(』,那麼這些左括號也是無效的。
主要步驟如下圖所示:
圖1為原始的陣列;c代表當前遍歷到的字元位置;s代表棧,儲存的是左括號的位置,為了找到右括號匹配之後復原左括號的,如果沒有匹配到就是無效字元。
圖2為遍歷到乙個左括號,先將左括號設定為『.』,將位置編號入棧。
圖3跟圖2描述一致。
圖4為遍歷到乙個右括號,先判斷s棧是否為空,s棧不空,將棧頂的對應位置的字元設定回左括號,然後位置序號出棧。
圖5跟圖4描述一致。
圖6為遍歷到乙個右括號,但是s棧為空,所有當前的右括號為無效字元,設定為『.』。
圖7為遍歷完整的字元,去除.的無效字元,最後就是有效的字串。
classsolution
//判斷是右括號並且棧不為空(代表前面有左括號),可以做匹配,出棧
//恢復前面的左括號
else
if(s[i] == '
)' && !p.empty())
//沒有左括號匹配,將當前符號複製為.
else
if(s[i] == '
)' &&p.empty())
}//當不是.,代表是有效符號
Leetcode 1249 移除無效的括號
給你乙個由 和小寫字母組成的字串 s。你需要從字串中刪除最少數目的 或者 可以刪除任意位置的括號 使得剩下的 括號字串 有效。請返回任意乙個合法字串。有效 括號字串 應當符合以下 任意一條 要求 空字串或只包含小寫字母的字串 可以被寫作 ab a 連線 b 的字串,其中 a 和 b 都是有效 括號字...
LeetCode 1249 移除無效的括號
類似於括號匹配的問題,第一次自己寫的時候,提交了好幾次才過,思路就是使用棧,主要需要處理的就是找到哪些括號是匹配的那些是不匹配的。首先遇到 就進棧,遇到 需要分兩種情況,如果棧不為空的時候,說明之前有過 就出棧,代表找到一對匹配的,但是如果棧為空,說明 在還沒有出現 的時候就先出現了,那麼顯然出現的...
Leetcode 1249 移除無效的括號 棧)
給你乙個由 和小寫字母組成的字串 s。你需要從字串中刪除最少數目的 或者 可以刪除任意位置的括號 使得剩下的 括號字串 有效。請返回任意乙個合法字串。有效 括號字串 應當符合以下 任意一條 要求 空字串或只包含小寫字母的字串 可以被寫作 ab a 連線 b 的字串,其中 a 和 b 都是有效 括號字...