摘要:一個合法的字符串是指左括號和右括號必定成對出現。要求得出用最少次數的刪除可以得到的所有的合法字符串。最后兩個結果重復,因此只保留,兩個結果。最終生成的合法字符串為。方法相同于上一種情況。其中出現了兩次。在該下標前的刪除將會產生重復的結果。
題目要求
Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results. Note: The input string may contain letters other than the parentheses ( and ). Examples: "()())()" -> ["()()()", "(())()"] "(a)())()" -> ["(a)()()", "(a())()"] ")(" -> [""]
現在有一個字符串包含一些左右括號以及字母。一個合法的字符串是指左括號和右括號必定成對出現。要求得出用最少次數的刪除可以得到的所有的合法字符串。
思路和代碼這道題目的思路源自于評論區。剛開始會有點難以理解,現在試圖理清這個思路。
先從題目中給的例子入手:()())()
當遍歷到第五個括號時,我們發現這個括號的存在非法。因此我們會從當前的三個右括號(下標分別為1, 3, 4)中選擇一個刪去。那么選擇哪個呢?其實選擇任意一個右括號都可以使當前的的子字符串合法,并依次生成如下三個結果(()),()(),()()。最后兩個結果重復,因此只保留(()),()()兩個結果。最終生成的合法字符串為[()()(), (())()]。
這里說明了一種情況,即右括號的數量多于左括號的數量。那么如何處理左括號的數量多于右括號數量的場景呢?如()(()
其實,我們只需要將其倒置為)(()(,并且將)(視為一組合法的括號即可。這時我們會看見下標2上的左括號不合法,對之進行處理即可。方法相同于上一種情況。
還要考慮一個問題,即出現重復的結果集的問題,就像例子中重復生成的的()()。我們如何才能避免使用Set來過濾掉重復的結果呢?
還是舉一個例子:()())())
按照之前的處理,當我們遍歷到下標4上的右括號時,我們有三個刪除選擇。而且我們發現當出現連續的右括號時,刪除該連續括號中的任意一個產生的結果都相同。所以默認情況下,我們刪除第一個括號。這時處理后的字符串為()()())以及(())())。
再對()()())處理,同樣的,當我們遇到最后一個右括號時,只需要刪除任意一個右括號就可以使數組成為合法數組,那么我們先根據第一個原則,刪除連續右括號的第一個括號,可以產生沒有重復的結果為(()()),()(()),()()()。
同理(())())可以處理出結果(()()),(())()。其中(()())出現了兩次。我們如何避免這樣的重復呢?這時我們需要記錄一下最后一次刪除所在的下標。在該下標前的刪除將會產生重復的結果。這里我們看到最后一次刪除的下標為3。對下標3之前的刪除將會帶來重復的結果(()())
public ListremoveInvalidParentheses(String s) { List result = new ArrayList (); removeInvalidParentheses(s, result, 0, 0, new char[]{"(", ")"}); return result; } public void removeInvalidParentheses(String s, List result, int lastRemoveIndex, int lastCheckedIndex, char[] pattern){ for(int stack = 0, i = lastCheckedIndex ; i =0) continue; for(int j = lastRemoveIndex ; j <= i ; j++){ if(s.charAt(j)==pattern[1] && (j == lastRemoveIndex || s.charAt(j-1)!=pattern[1])){ removeInvalidParentheses(s.substring(0, j) + s.substring(j+1), result, j, i, pattern); } } return; } String reversed = new StringBuilder(s).reverse().toString(); if(pattern[0] == "("){ removeInvalidParentheses(reversed, result, 0, 0, new char[]{")", "("}); }else{ result.add(reversed); } }
想要了解更多開發技術,面試教程以及互聯網公司內推,歡迎關注我的微信公眾號!將會不定期的發放福利哦~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68755.html
摘要:問題解答這題是看里面的的代碼如果比大或等的話,就繼續掃下去否則,我們就找到當前有可能刪去的,然后刪掉看新的如果只從左到右掃了,還是的時候,我們還要再從右往左掃一遍否則兩遍都掃完了,就加入結果中去 問題:Remove the minimum number of invalid parentheses in order to make the input string valid. Ret...
Problem Given a string containing just the characters ( and ), find the length of the longest valid (well-formed) parentheses substring. Example 1: Input: (()Output: 2Explanation: The longest valid pa...
摘要:前言從開始寫相關的博客到現在也蠻多篇了。而且當時也沒有按順序寫現在翻起來覺得蠻亂的。可能大家看著也非常不方便。所以在這里做個索引嘻嘻。順序整理更新更新更新更新更新更新更新更新更新更新更新更新更新更新更新更新 前言 從開始寫leetcode相關的博客到現在也蠻多篇了。而且當時也沒有按順序寫~現在翻起來覺得蠻亂的。可能大家看著也非常不方便。所以在這里做個索引嘻嘻。 順序整理 1~50 1...
摘要:在問題中,我們可以用來檢驗括號對,也可以通過來檢驗。遇到就加一,遇到就減一。找到一對括號就在最終結果上加。我們用來表示當前位置的最長括號。括號之間的關系有兩種,包含和相離。 Longest Valid Parentheses Given a string containing just the characters ( and ), find the length of the lon...
摘要:復雜度思路注意的地方,要限制左括號和右括號。每出現一次左括號,就相對于限定了,最多只能出現那么多右括號。所以,為了完成這種限定,用來控制。不然會有的情況出現。 LeetCode[22] Generate Parentheses Given n pairs of parentheses, write a function to generate all combinations of ...
閱讀 3235·2021-11-23 09:51
閱讀 2480·2021-09-27 13:34
閱讀 2464·2021-09-08 09:45
閱讀 662·2019-08-30 15:44
閱讀 3493·2019-08-29 12:17
閱讀 2759·2019-08-26 12:18
閱讀 2622·2019-08-26 10:10
閱讀 3078·2019-08-23 18:02