Google 面試題 | 有效括號字符串

專欄 | 九章算法程序員

網址 | http://www.jiuzhang.com面試

image

題目描述算法

給定一個字符串,由( * )三個字符組成,判斷是否知足要求左括號和有括號一一對應,
且對應的左括號一定在右括號前面。其中,*能夠被當作一個單獨的左括號,右括號或者可
以當作不存在
複製代碼

樣例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/
複製代碼

image

面試官角度分析3d

一道簡單的思惟題,考慮到星號在其中的用處就能解決
複製代碼

lintcode相關問題code

http://www.jiuzhang.com/solutions/valid-parentheses
複製代碼

image
分割線

歡迎關注個人微信公衆號:九章算法(ninechapter)。
精英程序員交流社區,按期發佈面試題、面試技巧、求職信息等

相關文章
相關標籤/搜索