刷了乙個困難題,一如既往做不出來,然後看題解,然後再自己打一遍…記錄這個題的原因是,這其實是一類題目!!!先看看題目再分析。
題目描述:
刪除最小數量的無效括號,使得輸入的字串有效,返回所有可能的結果。
說明: 輸入可能包含了除 ( 和 ) 以外的字元。
示例 1:
輸入: 「()())()」示例 2:輸出: ["()()()", 「(())()」]
輸入: 「(a)())()」示例 3:輸出: ["(a)()()", 「(a())()」]
輸入: 「)(」分析題目:輸出: [""]
這真的是一類題,題目具有的特徵:
1.求的是乙個子集
2.且子集滿足一定的條件
這類題目可以用乙個方法,就是dfs
關於這題dfs的分析:
1.dfs遍歷的行為?刪括號
2.什麼情況下刪?就是當左括號或者右括號有多的時候,正好當前遍歷的又是個多的括號,就刪!!!之後再繼續進行dfs遍歷刪除
3.出口是什麼?當沒有多餘的括號的時候!!!但注意此時還需要檢查一下當前的字串是否合法(即左右括號是否匹配!)
解題步驟:
1.先統計多餘的括號,注意並不是迴圈一遍統計左右括號個數,然後多的一方就是多餘的。
如 left= 2,right = 3,就認為右括號多乙個,因為可能之前的不匹配!!!
正確的統計方法是,當遇到左括號left++,遇到右括號時,若left > 0 就left --,說明一對括號匹配消除,若left == 0 ,right++,那麼這樣留下來的就是多餘的括號,沒有被匹配的括號!!!
2.然後開始dfs,從第乙個字串開始,若當前符號是多餘需要刪除,則刪除,
如:此時dfs遍歷時left = 0,right = 1,當前是s[ i ] 為左括號則跳過,若為右括號則刪除,
然後對後面進行遞迴dfs。
3.直到left 為 0 ,right為 0,進行檢查,匹配加入set< string >
**如下:
class
solution
}return
true;}
void
dfs(set
&result,string s,
int left,
int right,
int index)
for(
int i = index;i < s.
size()
;i++)}
vector
removeinvalidparentheses
(string s)
} set result;
dfs(result,s,left,right,0)
;return vector
(result.
begin()
,result.
end())
;}};
總結:
關於dfs不要怕,步驟就是,首先遞迴的操作,其次遞迴的出口!!!
301 刪除無效的括號(BFS)
刪除最小數量的無效括號,使得輸入的字串有效,返回所有可能的結果。說明 輸入可能包含了除 和 以外的字元。示例 1 輸入 輸出 示例 2 輸入 a 輸出 a a 示例 3 輸入 輸出 思路 廣度優先 bfs 廣度優先 bfs public listremoveinvalidparentheses st...
leetcode301 刪除無效的括號
刪除最小數量的無效括號,使得輸入的字串有效,返回所有可能的結果。說明 輸入可能包含了除 和 以外的字元。示例 1 輸入 輸出 示例 2 輸入 a 輸出 a a 示例 3 輸入 輸出 class solution object def isvalid self,s count 0 for c in s...
leetcode 301 刪除無效的括號
301.刪除無效的括號 刪除最小數量的無效括號,使得輸入的字串有效,返回所有可能的結果。說明 輸入可能包含了除 和 以外的字元。示例 1 輸入 輸出 示例 2 輸入 a 輸出 a a 示例 3 輸入 輸出 這道題的問題是最小刪除次數,所以這裡優先選用 bfs.使用棧來判斷是否合法 stack for...