[英]Binary String Reduction
你給出一個二進制串(只有0和1級的)■長度的n個。
您希望通過執行以下操作最少次數將s轉換為空字符串。
您的任務是確定將 s 轉換為空字符串所需的最少操作數。
筆記:
字符串 s 的交替子序列定義如下
約束:
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.