簡體   English   中英

二進制字符串約簡

[英]Binary String Reduction

你給出一個二進制串(只有0和1級的)■長度的n個
您希望通過執行以下操作最少次數將s轉換為空字符串。

  • 在一個操作中,您可以從s 中刪除一個交替的子序列,而無需更改剩余字符的順序。

您的任務是確定將 s 轉換為空字符串所需的最少操作數。

筆記:

字符串 s 的交替子序列定義如下

  • 任何長度為 1 的子序列
  • 如果長度大於 1,並且沒有兩個連續元素相等。 例如,“0101”、“101”、“0”是交替序列,而“100”和“01011”則不是。

約束:

1 <= T <= 10
1 <= n <= 10^6

樣本輸入:

1
10
0100100111

示例輸出:

3

解釋:

從“ 01 0 01 0 01 11”中刪除子序列“010101”使其成為“0011”

從“ 0 01 1 ”中刪除子序列“ 01”以使其成為“ 01”

最后,從“ 01 ”中刪除子序列“ 01”以使其成為“”(空二進制字符串)

想象一下,對於某個字符串x ,您知道可以使用m 個以“0”結尾的操作和n 個以“1”結尾的操作來擦除它,總共 ( m+n ) 個操作。 我們將寫這個 (m,n)。 這不一定是最好的結果,但它是一個結果。

現在,您對字符串x0了解多少?

如果 n>1,那么您可以向那些以 1 結尾的操作之一添加零,將其轉換為以零結尾的操作,因此您可以清除 (m+1,n-1) 操作中的x0

當然,您總是可以添加一個新的0 結束操作,以便您可以清除 (m+1,n) 操作中的x0

同樣,您可以在 (m,n+1) 操作中清除x1 ,如果 m>0,則可以清除 (m-1,n+1)。

顯然只有一種方法可以清除空字符串,那就是 (0,0) 操作,所以從頭到尾工作,您可以計算所有各種 (m,n) 可能性來清除每個前綴,直到您得到到最后,然后總和最小的那個就是你的答案。 那將是一個 O(n 2 ) 算法。

但是,有其中任何情況下,選擇(M + 1,N)代替(M + 1,N-1),使您能夠全面使用較少的操作。 類似地,也不存在選擇 (m, n+1) 優於 (m-1,n+1) 的情況。

因此,與其擔心每個位置的兩種可能選擇,我們可以確定性地做出單個最佳選擇,具體取決於下一個字符是 0 還是 1:

以 x="" 和 (m,n) = (0,0) 開頭:

  • 當下一個字符為 0 時,則 x <- x+"0" 和 (m,n) <- (m+1,max(n-1,0))

  • 當下一個字符為 1 時,則 x <- x+"1" 和 (m,n) <- (max(m-1,0),n+1)

當您到達字符串的末尾時,m+n 是可以清除它的最少操作數。

或者,在偽代碼中:

m = 0; n = 0;
for (char in string) {
    if (char == 0') {
        m = m+1;
        n = max(n-1,0);
    } else {
        m = max(m-1,0);
        n = n+1;
    }
}
return m+n;

十分簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM