思路:刪除最小數量的無效括號,使得輸入的字串有效,返回所有可能的結果。
說明: 輸入可能包含了除 ( 和 ) 以外的字元。
輸入:
"(a)())()"
輸出:[
"(a)()()"
,"(a())()"
]
首先思考刪括號是否有規律可循,我想了半天是沒想出來,也許有吧。。。
所以我採用的就是比較暴力的方法,遍歷所有的刪除括號的可能,因此有bfs和dfs這兩種選擇,由於我們要求的是刪除最少的括號的方法,因此類似於「最短路徑」,所以我們採用bfs,一旦滿足條件,就不必往下一層再遍歷了。
首先定義乙個函式判斷該字串是否滿足合法括號的條件:
public
boolean
isvaild
(string s)
}return count==0;
}
接下來進行層次遍歷,可以直接採用bfs的模板。
但是有一點需要注意的是,也許我們刪除不同位置的括號最終得到的字串是一樣的,因此我們還需要去重,這裡使用hashset來去重。
當然我們還需要乙個flag標誌來指示是否還需要繼續向下一層遍歷,有人可能會問,只要滿足了isvaild不就可以終止遍歷了嗎?答案是當然不是,因為題目中要求的不是任意乙個刪除方法,而是要求刪除最小數量的無效括號,使得輸入的字串有效,返回所有可能的結果。因此直接返回是不可以的,遇到滿足了isvaild的還需要繼續遍歷完這一層然後再退出迴圈!!!!
正確**如下:
public list
removeinvalidparentheses
(string s)
queue
que=
newlinkedlist
<
>()
; set
set=
newhashset
<
>()
; que.
offer
(s);
boolean flag=
false
;while
(!que.
isempty()
)if(flag)
continue
;for
(int i=
0;ilength()
;i++)}
}if(flag)
return list;}if
(list.
isempty()
) list.
add("")
;return list;
}
力扣解題思路 打家劫舍
思路 題目 你是乙個專業的小偷,計畫偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味著第乙個房屋和最後乙個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在...
力扣解題思路 素數
首先,如何判斷乙個數是否為素數呢,首先我們知道最小的素數是2,那麼我們從2開始判斷該數是否能找到被除數即可,完整 如下 public boolean isprimenum int i return true 思路 統計所有小於非負整數 n 的質數的數量。那麼這一題我們需要對每個小於n的數進行判斷一次...
力扣解題思路 區間排序問題
思路 每次遇到和區間有關的題都要思考半天區間的排序方法,是根據區間左邊排序還是根據區間右邊排序呢?另外遇到這種題目如果採取貪心演算法最後的結果會不會是最優的呢?主要是因為研究生期間我的研究方向是強化學習演算法,其中用到的貪婪演算法容易陷入區域性最優,所以每次看到適合用貪婪演算法解題的題目時總會思考貪...