LeetCode-1249.移除無效的括號
阿新 • • 發佈:2020-10-29
題目下圖所示:
題目大概的意思是輸入一組字串,字串包含小寫字母和‘(’、‘)’,保留能匹配成一對的小括號,去掉多餘的‘(’或者‘)’。答案可能會有多個,只需要輸出一個正常的字串就可以。
方案:
括號匹配,我們可以使用棧的資料結構來匹配成對的括號,遇到一個左括號‘(’就入棧,如果遇到一個右括號‘)’,需要判斷棧是否為空(代表右括號前面是否有左括號跟它匹配),棧為空,那麼這個就是無效的右括號;如果遍歷完字串,棧不為空,還有左括號‘(’,那麼這些左括號也是無效的。
主要步驟如下圖所示:
圖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; } };
喜歡的可以關注公眾號檢視更多的文章