題目連結:
題目意譯:
你被給定一字串 s,其中每兩個相鄰垂直線 '|' 都會被分到同一組。換句話說,第一和第二個 '|' 形成一組、第三和第四個 '|' 形成一組,以此類推。
回傳去除掉每一組 '|' 之間的 '*' 後,s 中 '*' 的數量。
注意到每個 '|' 只會屬於恰好一組之中。
限制:
1 ≦ s.length ≦ 1000
s 由小寫英文字母、垂直線 '|' 和星號 '*' 組成。
s 包含偶數數量的垂直線 '|'。
範例測資:
範例 1:
輸入: s = "l|*e*et|c**o|*de|"
輸出: 2
解釋: 有被考慮進來的字元以底線標示:"l|*e*et|c**o|*de|"。
位於第一和第二個 '|' 之間的字元將排除在答案之外。
同樣地,位於第三和第四個 '|' 之間的字元將排除在答案之外。
現在只有 2 個星號有被考慮進來。因此我們回傳 2。
範例 2:
輸入: s = "iamprogrammer"
輸出: 0
解釋: 在此例中,s 中沒有任何星號。因此我們回傳 0。
範例 3:
輸入: s = "yo|uar|e**|b|e***au|tifu|l"
輸出: 5
解釋: 有被考慮進來的字元以底線標示:"yo|uar|e**|b|e***au|tifu|l"。現在只有 5 個星號有被考慮進來。因此我們回傳 5。
解題思維:
因為每兩個 '|' 是一組的,因此我們可以用一個布林變數來表示目前有沒有遇過同一組中開頭的 '|'(代表接下來的字元都應被忽略),沒有為「假」、有則為「真」。而當在值為「真」的情況下遇到另一個 '|' 時,其值應重設為「假」(因為代表現在遇到的 '|' 是同一組中的結尾)。
因此我們就直接掃過 s,然後根據上面的規則來更新該變數之值。而對於 '*',只需要看變數的值即可判斷是否要納入答案之中(「真」代表要忽略此星號;反之則應加入答案)。
最後掃完之後便可以得到所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。