前往
大廳
主題

LeetCode - 1864. Minimum Number of Swaps to Make the Binary String Alternating 解題心得

Not In My Back Yard | 2021-07-14 00:00:03 | 巴幣 0 | 人氣 113

題目連結:


題目意譯:
給定一個字串 s ,回傳最小所需字元交換之次數使得它交錯,或是 -1 如果無法使 s 變為交錯。

字串被稱作「交錯的」如果沒有任何兩個相鄰字元相同。例如,字串 "010" 和 "1010" 為交錯的,而字串 "0100" 則不是。

任兩個字元可以被交換,儘管兩個字元不相鄰。

限制:
1 ≦ s.length ≦ 1000
s[i] 只會是 '0' 或是 '1' 。



範例測資:
範例 1:
輸入: s = "111000"
輸出: 1
解釋: 將位置 1 與位置 4 交換: "111000" → "101010" 。字串現在交錯了。

範例 2:
輸入: s = "010"
輸出: 0
解釋: 字串已經是交錯的了,不需任何交換。

範例 3:
輸入: s = "1110"
輸出: -1


解題思維:
我們先掃過一次字串 s ,統計其 '0' 和 '1' 各自的數量。如果 '0' 與 '1' 的數量之絕對差值超過 1 ,代表我們沒辦法使 s 變為交錯(因為一定會有兩個相同的字元被擺在一起)。此時回傳 -1 。

如果 '0' 是 '1' 的數量 + 1,則要使字串交錯的話應以 '0' 開頭之 "010101……" 的形式;如果 '1' 為 '0' 的數量 + 1,則應為 "101010……" 之形式;如果兩者等量,則兩個形式('0' 或是 '1' 開頭)都需要試試看。

當我們決定好形式 P 之後,我們將 P 與原本的字串 s 去做比對。當 s[i] 與 P[i] 不相等時,代表我們要從某處交換過來使得 s[i] = P[i]。

我們統計完所有不相等字元的數量後(假設其值為 C),可以看到 C 必定為偶數。

為何必定偶數?我們在前面就已經確認過形式 P 應為何者,因此 P 與 s 有著相同數量的 '0' 和 '1',所以因為當一個 '1' 不在應在的位置時,它必須與一個 '0' 交換;同樣地,'0' 不在對應位置時應與 '1' 交換。

所以我們也可以看到 C ÷ 2 即是所求的交換次數。

不過因為當 '0' 數量 = '1' 數量時有兩種可能的形式。此時我們只需兩種形式都試試看,根據以上步驟計算出交換次數,最小的才是所求。




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

創作回應

更多創作