九章演算法 Google 面試題 有效括號字串

2021-10-01 16:08:36 字數 1188 閱讀 4566

撰文 | jz

專欄 | 九章演算法

給定乙個字串,由( * )三個字元組成,判斷是否滿足要求左括號和有括號一一對應,且對應的左括號必定在右括號前面。其中,*可以被當做乙個單獨的左括號,右括號或者可以當做不存在

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了

一道簡單的思維題,考慮到星號在其中的用處就能解決

九章演算法 Google面試題 內積

描述 給定長度為n的a陣列,長度為k的b陣列 你可以從a陣列裡取k個數 規則如下 即每次可以從a陣列的最左邊或者最右邊取走乙個數,取走的數從陣列中移除 將取出的ai按取出的順序組成c陣列 求b與c的內積最大值 b與c內積為 i 0k 1bi ci 解釋1 a 1,4,3,2,5 b 1,2,3,4 ...

九章演算法 Google 面試題 解碼方法

有乙個訊息包含 a z 通過以下規則編碼 a 1 b 2 z 26 現在給你乙個加密過後的訊息,問有幾種解碼的方式 樣例 1 輸入 12 輸出 2 解釋 它可以被解碼為 ab 1 2 或 l 12 樣例 2 輸入 10 輸出 1 演算法 動態規劃 dp 演算法思路 思路 複雜度分析 n表示字串長度 ...

九章演算法 Google面試題 島嶼的個數II

給定 n,m,分別代表乙個二維矩陣的行數和列數,並給定乙個大小為 k 的二元陣列a.初始二維矩陣全0.二元陣列a內的k個元素代表k次操作,設第i個元素為 a i x,a i y 表示把二維矩陣中下標為a i x行a i y列的元素由海洋變為島嶼.問在每次操作之後,二維矩陣中島嶼的數量.你需要返回乙個...