給定乙個只包括 『(』,』)』,』』,』[』,』]』 的字串,判斷字串是否有效。
有效字串需滿足:
左括號必須用相同型別的右括號閉合。
左括號必須以正確的順序閉合。
注意空字串可被認為是有效字串。
示例 1:
輸入: 「()」
輸出: true
示例 2:
輸入: 「(){}」
輸出: true
示例 3:
輸入: 「(]」
輸出: false
示例 4:
輸入: 「([)]」
輸出: false
示例 5:
輸入: 「」
輸出: true
我首先想到的解法是:將(]組成另外乙個字串。然後對字串s裡的每乙個字元進行判斷,在這兩個新字串中是否能找到。但是這種方法真的麻煩,我最後沒寫出來。因為和{}這兩種真的情況在我的演算法裡沒法同時滿足。然後就在討論區看到了大佬的回答,簡潔明瞭,貼上來學習一下。
class
solution
:def
isvalid
(self, s)
:while
'{}'
in s or
'()'
in s or
''in s:
s = s.replace(
'{}',''
) s = s.replace('',
'')s = s.replace(
'()',''
)return s ==
''
class
solution")
+ s.
indexof(""
)+ s.
indexof
("()"))
>-3
)",""
);s = s.
replace
("()",""
);s = s.
replace(""
,"");
}if(s.equals(""
))return
true
;else
return
false;}
}
這道題其實還有許多的知識盲區,比如官方題解中給出的棧的解法。我能回想起關於棧的知識,無非就是先進後出。
棧先入後出特點恰好與本題括號排序特點一致,即若遇到左括號入棧,遇到右括號時將對應棧頂左括號出棧。有了鍊錶的加持,這道題目就迎刃而解了。因為還沒實現過資料結構,所以就不在部落格裡分析了,大神解題思路指路:棧的解法
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
LeetCode每日一題(題1028)
最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...
LeetCode每日一題(題139)
題目 題目大意 給出乙個字串s和乙個字串陣列words,判斷s是否能夠拆分成多個words中的字串。分析 這道題比較簡單的方式應該是採用動態規劃來做。對於任意乙個字串中的區間,可以判斷該區間組成的字串是否在字典中,如果是,則這個區間的真假取決於前面那個區間的真假。給出狀態轉移方程dp i dp j ...