1888. Minimum Number of Flips to Make the Binary String Alternating - Medium
前往題目
想法
- Sliding window
思路
- 原本的字串加上自己,這樣走過所有
window
等於把所有s
的可能性都走過了 - 另外準備兩個字串
alt1
和alt2
,與s
等長,是alternating binary string
sliding window
從s
最左邊開始,與alt1
以及alt2
相比,紀錄有多少個不同(diff
)- 每次循環如果超過
s
的長度,縮小 - 如果和
s
等長,紀錄diff
最小值
這個思路簡潔明瞭,完美化解這題的所有障礙,寫起來也簡單,沒有什麼
fancy
的東西,就是把s
變成s+s
這個實在是神來一筆,其餘的就是sliding window
的操作
Code
class Solution {
public int minFlips(String s) {
int n = s.length();
s = s + s;
StringBuilder alt1 = new StringBuilder("");
StringBuilder alt2 = new StringBuilder("");
// Build up alternating strings
for (int i = 0; i < s.length(); ++i) {
if (i % 2 == 1) {
alt1.append("0");
} else {
alt1.append("1");
}
if (i % 2 == 1) {
alt2.append("1");
} else {
alt2.append("0");
}
}
int res = s.length();
int diff1 = 0, diff2 = 0;
int l = 0;
// Sliding window
for (int r = 0; r < s.length(); ++r) {
if (s.charAt(r) != alt1.charAt(r)) {
++diff1;
}
if (s.charAt(r) != alt2.charAt(r)) {
++diff2;
}
// Window oversized, shrink it
if ((r - l + 1) > n) {
if (s.charAt(l) != alt1.charAt(l)) {
--diff1;
}
if (s.charAt(l) != alt2.charAt(l)) {
--diff2;
}
++l;
}
// Update min number of flips
if ((r - l + 1) == n) {
res = Math.min(res, Math.min(diff1, diff2));
}
}
return res;
}
}
1888. Minimum Number of Flips to Make the Binary String Alternating - Medium
https://f88083.github.io/2024/07/22/1888-Minimum-Number-of-Flips-to-Make-the-Binary-String-Alternating/