給定乙個只包含三種字元的字串:( ,) 和 *,寫乙個函式來檢驗這個字串是否為有效字串。有效字串具有如下規則:正反兩次遍歷,正向遍歷時,把*當成是左括號壓棧,這裡使用乙個計數器left模擬棧操作,如果中間某個時刻left小於0了,說明把至今為止所有*當成是左括號都不能匹配完右括號(右括號多),因此返回false。如果遍歷結束後,left=0,則說明*恰好和右括號匹配,返回true。任何左括號 ( 必須有相應的右括號 )。
任何右括號 ) 必須有相應的左括號 ( 。
左括號 ( 必須在對應的右括號之前 )。
* 可以被視為單個右括號 ) ,或單個左括號 ( ,或乙個空字串。
乙個空字串也被視為有效字串。
示例 1:
輸入: "()"
輸出: true
示例 2:
輸入: "(*)"
輸出: true
示例 3:
輸入: "(*))"
輸出: true
注意:字串大小將在 [1,100] 範圍內。
而遍歷完就算計數器大於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...