1. 程式人生 > 實用技巧 >LeetCode-1249.移除無效的括號

LeetCode-1249.移除無效的括號

題目下圖所示:

  題目大概的意思是輸入一組字串,字串包含小寫字母和‘(’、‘)’,保留能匹配成一對的小括號,去掉多餘的‘(’或者‘)’。答案可能會有多個,只需要輸出一個正常的字串就可以。


方案:

  括號匹配,我們可以使用棧的資料結構來匹配成對的括號,遇到一個左括號‘(’就入棧,如果遇到一個右括號‘)’,需要判斷棧是否為空(代表右括號前面是否有左括號跟它匹配),棧為空,那麼這個就是無效的右括號;如果遍歷完字串,棧不為空,還有左括號‘(’,那麼這些左括號也是無效的。

主要步驟如下圖所示:

圖1為原始的陣列;C代表當前遍歷到的字元位置;S代表棧,儲存的是左括號的位置,為了找到右括號匹配之後復原左括號的,如果沒有匹配到就是無效字元。

圖2為遍歷到一個左括號,先將左括號設定為‘.’,將位置編號入棧。

圖3跟圖2描述一致。

圖4為遍歷到一個右括號,先判斷S棧是否為空,S棧不空,將棧頂的對應位置的字元設定回左括號,然後位置序號出棧。

圖5跟圖4描述一致。

圖6為遍歷到一個右括號,但是S棧為空,所有當前的右括號為無效字元,設定為‘.’。

圖7為遍歷完整的字元,去除.的無效字元,最後就是有效的字串。


實現程式碼

class Solution {
public:
    string minRemoveToMakeValid(string s) {
        string res;
        int nLen = s.length();
        stack
<int> p; for(int i=0; i<nLen; i++) { //判斷左括號入棧 //可能沒有右括號匹配,暫設定為. if(s[i] == '(') { p.push(i); s[i] = '.'; } //判斷是右括號並且棧不為空(代表前面有左括號),可以做匹配,出棧 //恢復前面的左括號 else if(s[i] == ')' && !p.empty()) { s[p.top()]
= '('; p.pop(); } //沒有左括號匹配,將當前符號複製為. else if(s[i] == ')' && p.empty()) { s[i] = '.'; } } //當不是.,代表是有效符號 for(int i=0; i<nLen; i++) { if(s[i] != '.') { res += s[i]; } } return res; } };

喜歡的可以關注公眾號檢視更多的文章