leetcode算法題解 20題 python Ver.
題目
給定一個只包括 '(',')','{','}','[',']' 的字符串,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認為是有效字符串。
輸入: "()"
輸出: true
示例 2:
輸入: "()[]{}"
輸出: true
示例 3:
輸入: "(]"
輸出: false
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/valid-parentheses
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
思路
這個問題可以用堆棧的思路來解決,遍歷字符串,把左括號不斷的壓入棧中,直到遇見右括號,去棧中判斷最后一個被壓入的左括號是否是對應的右括號,如果不是,返回False。最后查看棧中是否還有括號,如果有,那么返回False;如果沒有,那么返回True。
由于python中的list數據類型,可以直接當做棧來使用。使用到的屬性為:append(即為入棧),pop(即為出棧),其中list[-1]為棧頂,list[0]為棧底。
解答
情況分析
當字符串為空時
按照題意,應該是有效的。
if len(s) == 0:
return True
當字符串中只有右括號時
此時,棧為空,也會觸發有效。所以應該加上一個判斷條件來避免判斷錯誤。
Sstack = []#list為棧
length = 0
if i == '{' or i == '(' or i =='[':
Sstack.append(i)#將括號壓入棧中
else:
length += 1#記錄右括號的數量
當字符串中右括號比左括號多時
例如:'{}()]]'
此時length這個變量起到作用,每出棧一個左括號,length就減1,當length=0且棧中元素為空同時滿足時,便可以判定有效了。
代碼
class Solution:
def isValid(self, s: str) -> bool:
Sstack = []
length = 0
if len(s) == 0:
return True
for i in s:
if i == '{' or i == '(' or i =='[':
Sstack.append(i)
else:
length += 1
if len(Sstack) != 0:
if i == '}' and Sstack[-1] == '{':
Sstack.pop()
length -= 1
if i == ']' and Sstack[-1] == '[':
Sstack.pop()
length -= 1
if i == ')' and Sstack[-1] == '(':
Sstack.pop()
length -= 1
return len(Sstack) == 0 and length == 0
通過截圖
image-20200223154749719
復雜度
由于入棧出棧均為O(1)時間,整個程序僅有一個循環,所以時間復雜度應該為O(n)
聯系方式
感謝閱讀!如果您對本片博文有任何意見或者建議,請聯系我。感謝不盡??