力扣 leetcode 1758. 生成交替二進位制字串的最少運算元
阿新 • • 發佈:2022-11-29
問題描述
給你一個僅由字元 '0'
和 '1'
組成的字串 s
。一步操作中,你可以將任一 '0'
變成 '1'
,或者將 '1'
變成 '0'
。
交替字串 定義為:如果字串中不存在相鄰兩個字元相等的情況,那麼該字串就是交替字串。例如,字串 "010"
是交替字串,而字串 "0100"
不是。
返回使 s
變成 交替字串 所需的 最少 運算元。
提示:
1 <= s.length <= 10^4
s[i] 是 '0' 或 '1'
示例
示例 1:
輸入:s = "0100"
輸出:1
解釋:如果將最後一個字元變為 '1' ,s 就變成 "0101" ,即符合交替字串定義。
示例 2:
輸入:s = "10" 輸出:0 解釋:s 已經是交替字串。
示例 3:
輸入:s = "1111"
輸出:2
解釋:需要 2 步操作得到 "0101" 或 "1010" 。
解題思路
這道題要做的是判斷字串相鄰字元相同的個數,但是需要考慮的是可能某個字元替換之後,也會對後續的結果產生影響,例如, s="000"
,將下標 1
處的 '0'
替換為 '1'
之後,就組成了交替字元。
另外,還存在 s="1101"
的情況,如果我們先判斷 s[1] == s[0]
,並將 s[1]
替換為 '0'
,就需要再替換 s[2]
和 s[3]
,共替換 3
次。 而實際上的最小替換次數為 1
次,即將 s[0]
替換即可。在這種情況下,我們不需要重新考慮,我們可以發現, 3+1=4
,而 4
"1010"
,第二種替換結果是 "0101"
。因此,我們只需計算一次替換次數,然後選擇 min(cnt, s.length() - cnt)
即可。 程式碼如下:
class Solution { public: int minOperations(string s) { int cnt = 0; bool replace = false; // 我們不對字串進行修改,而是用一個遍歷記錄上一個字元是否已經修改過了 for(int i = 1; i < s.size(); i++){ if(s[i] == s[i - 1] && !replace){ cnt++; replace = true; } else if(s[i] != s[i - 1] && replace){ cnt++; } else if(s[i] == s[i - 1] && replace){ replace = false; } } cnt = (cnt + cnt) < s.size() ? cnt : (s.size() - cnt); return cnt; } };
提交程式碼時,這裡的 if-else
判斷的次序對時間影響很大。