leetcode678 有效的括號字串

2021-09-29 11:07:07 字數 1496 閱讀 1058

給定乙個只包含三種字元的字串:( ,) 和 *,寫乙個函式來檢驗這個字串是否為有效字串。有效字串具有如下規則:

任何左括號 ( 必須有相應的右括號 )。

任何右括號 ) 必須有相應的左括號 ( 。

左括號 ( 必須在對應的右括號之前 )。

* 可以被視為單個右括號 ) ,或單個左括號 ( ,或乙個空字串。

乙個空字串也被視為有效字串。

示例 1:

輸入: "()"

輸出: true

示例 2:

輸入: "(*)"

輸出: true

示例 3:

輸入: "(*))"

輸出: true

注意:字串大小將在 [1,100] 範圍內。

正反兩次遍歷,正向遍歷時,把*當成是左括號壓棧,這裡使用乙個計數器left模擬棧操作,如果中間某個時刻left小於0了,說明把至今為止所有*當成是左括號都不能匹配完右括號(右括號多),因此返回false。如果遍歷結束後,left=0,則說明*恰好和右括號匹配,返回true。

而遍歷完就算計數器大於0了,我們暫時不能返回false,因為有可能多餘的左括號是星號變的,星號也可以表示空,所以有可能不多,我們還需要反向遍歷一下,我們將所有的星號當作右括號,遇右括號計數器right加1,遇左括號則自減1,如果中間某個時刻計數器小於0了,直接返回false。遍歷結束後直接返回true,這是為啥呢?此時計數器有兩種情況,要麼為0,要麼大於0。為0的話返回true,和前向遍歷的情況一樣。大於0的話,說明因為之前正向遍歷的時候,我們的左括號多了,我們之前說過了,多餘的左括號可能是星號變的,也可能是本身就多的左括號。本身就多的左括號這種情況會在反向遍歷時被檢測出來,如果沒有檢測出來,說明多餘的左括號一定是星號變的。而這些星號在反向遍歷時又變做了右括號,最終導致了右括號有剩餘,所以當這些星號都當作空的時候,左右括號都是對應的,即是合法的。你可能會有疑問,右括號本身不會多麼,其實不會的,如果多的話,會在正向遍歷中被檢測出來。

class solution(object):

def checkvalidstring(self, s):

""":type s: str

:rtype: bool

"""left=0

for c in s:

if c=="(" or c=="*":

left+=1

else:

left-=1

if left < 0:

return false

if left == 0:

return true

right=0

for c in s[::-1]:

print c

if c==")" or c=="*":

right+=1

else:

right-=1

if right < 0:

return false

return true

Leetcode 678 有效的括號字串

給定乙個只包含三種字元的字串 和 寫乙個函式來檢驗這個字串是否為有效字串。有效字串具有如下規則 任何左括號 必須有相應的右括號 任何右括號 必須有相應的左括號 左括號 必須在對應的右括號之前 可以被視為單個右括號 或單個左括號 或乙個空字串。乙個空字串也被視為有效字串。示例 1 輸入 輸出 true...

Leetcode 678 有效的括號字串

給定乙個只包含三種字元的字串 和 寫乙個函式來檢驗這個字串是否為有效字串。有效字串具有如下規則 任何左括號 必須有相應的右括號 任何右括號 必須有相應的左括號 左括號 必須在對應的右括號之前 可以被視為單個右括號 或單個左括號 或乙個空字串。乙個空字串也被視為有效字串。示例 1 輸入 輸出 true...

leetcode 678有效的括號字串

給定乙個只包含三種字元的字串 和 寫乙個函式來檢驗這個字串是否為有效字串。有效字串具有如下規則 任何左括號 必須有相應的右括號 任何右括號 必須有相應的左括號 左括號 必須在對應的右括號之前 輸入 輸出 true 示例 2 輸入 輸出 true 示例 3 輸入 輸出 true 注意 字串大小將在 1...