專欄 | 九章算法程序員
網址 | http://www.jiuzhang.com面試
題目描述算法
給定一個字符串,由( * )三個字符組成,判斷是否知足要求左括號和有括號一一對應,
且對應的左括號一定在右括號前面。其中,*能夠被當作一個單獨的左括號,右括號或者可
以當作不存在
複製代碼
樣例bash
1. **Input**: "()" **Output**: True
2. **Input**: "(*)" **Output**: True //*被當作空字符,不存在
3. **Input**: "(*))" **Output**: True //星號被當作左括號
複製代碼
解題思路分析微信
首先進行最基礎的考慮,(在不考慮星號的狀況下)咱們一定會選擇位置最接近的左右括號配對,這樣
避免了人爲形成的右括號前面沒有左括號匹配的慘劇。所以咱們在寫程序進行處理的時候,對於每一個右
括號判斷前面是否有1個左括號能被他擁有,若是左括號數量不足,這個字符串一定是false,或者當整
個串被匹配完以後發現有多餘的左括號,這個字符串一樣是false
複製代碼
接下來考慮有星號的狀況:")"必須由位置在它以前的"("或"*"匹配,若是"("或者"*"數量不足致使的
false是沒法避免的,而若是"("比")"多,將"("與"*"優先匹配能夠減少false的可能性。舉個例子如
樣例3,從左往右遍歷的時候,優先匹配"("和"*",碰見第一個")",發現沒有單獨的"(",從"(*"的組
閤中拆出一個"("與之匹配,而原先匹配中的*由於能夠等同於不存在便不予理會,接着遇到第二個」)」,
拿走剛纔剩餘的"*"。綜上咱們能夠觀察到,"("容易受制於")"而將其與"*"匹配後就很靈活,不只避免
了數量太多帶來的麻煩,也能在和*匹配後再次提供自身給")"進行匹配。而若是這樣匹配結束還有多餘
的"("則一定false
複製代碼
咱們設l(left)爲必須被右括號匹配的左括號數量,cp(couple)爲前面左括號和星號數量。遍歷字
符串,遇到左括號和星號的時候,cp++;遇到右括號的時候cp—;遇到星號,默認先於前面的左括號(l>0)
匹配,此時(l—),遇到右括號,默認先與前面必須與右括號匹配的左括號匹配,此時(l—;cp—;)或者在支
援兵中考慮(cp—) 注意cp是前方左右的左括號和星號數量,一旦cp<0即false.匹配完發現(l>0)即多出
了左括號,也爲false。剩下的狀況就是true了
複製代碼
參考程序spa
http://www.jiuzhang.com/solution/valid-parenthesis-string/
複製代碼
面試官角度分析3d
一道簡單的思惟題,考慮到星號在其中的用處就能解決
複製代碼
lintcode相關問題code
http://www.jiuzhang.com/solutions/valid-parentheses
複製代碼