301 刪除無效的括號 Leecode刷題

2021-10-01 12:35:04 字數 1719 閱讀 1174

刷了乙個困難題,一如既往做不出來,然後看題解,然後再自己打一遍…記錄這個題的原因是,這其實是一類題目!!!先看看題目再分析。

題目描述:

刪除最小數量的無效括號,使得輸入的字串有效,返回所有可能的結果。

說明: 輸入可能包含了除 ( 和 ) 以外的字元。

示例 1:

輸入: 「()())()」

輸出: ["()()()", 「(())()」]

示例 2:

輸入: 「(a)())()」

輸出: ["(a)()()", 「(a())()」]

示例 3:

輸入: 「)(」

輸出: [""]

分析題目:

這真的是一類題,題目具有的特徵:

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...