前往
大廳
主題

LeetCode - 1576. Replace All ?'s to Avoid Consecutive Repeating Characters 解題心得

Not In My Back Yard | 2023-05-09 12:00:10 | 巴幣 2 | 人氣 133

題目連結:


題目意譯:
給定一個只由小寫英文字母以及 '?' 字元組成的字串 s,請將所有 '?' 轉換成小寫字母使得最終字串不包含任何連續的相同字元。你不得更動任何非 '?' 的字元。

保證在給定的字串中除了 '?' 以外沒有連續的相同字元。

回傳做完所有轉換之操作(可能沒有)之後的最終字串。如果有多組可行解,則回傳任意一個。可以證明在給定的條件下,必定存在至少一組答案。

限制:
1 ≦ s.length ≦ 100
s 由小寫英文字母以及 '?' 組成。



範例測資:
範例 1:
輸入: s = "?zs"
輸出: "azs"
解釋: 對於這個例子有 25 個可行解。從 "azs" 到 "yzs",全部都是合法的。只有 "z" 是不合法的更動,因為這將導致字串變成有著連續的相同字元的 "zzs"。

範例 2:
輸入: s = "ubv?w"
輸出: "ubvaw"
解釋: 對於這個例子有 24 個可行解。只有 "v" 和 "w" 是不合法的更動,因為這將導致字串變成有著連續的相同字元的 "ubvvw" 或 "ubvww"。


解題思維:
其實就是盡可能地把 '?' 替換成最小的字母即可。

首先,如果 s[0](即開頭字元)是 '?',則我們看一下 s[1](如果有的話)是否為 'a'。如果是則 s[0] 最小只能變成 'b';反之,則 s[0] 可以變成最小的 'a'。之後,我們也對最後一個字元做類似的操作與判斷。

接著對於剩下的字元 s[i],掃過一次所有字母 'a' ~ 'z',看哪個字母不與 s[i - 1] 相同且也不和 s[i + 1] 相同,取其中最小的即可。

最後便可以把每一個 '?' 變成盡可能地小的字母,此時的字串即為所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作