题目浅析

  • 想查看原题可以点击题目链接

  • 简单地说,就是给一个由 0 和 1 组成的字符串,想把该字符串改造为交替字符串,也就是 0 和 1 交替,但是只能做两个操作,1. 把第一个字符放到最后; 2. 使任意位置字符反转(0和1)。求实现的最少操作二次数。

思路分享

代码解答(强烈建议自行解答后再看)

  • 参考解决方案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Solution {
public:
int minFlips(string s) {
int n = s.size();
s = s + s; // 双倍,通过滑动窗口模拟操作一

// 对于滑动窗口的每个值,要满足的字符串情况有两种 010101 和 101010
int cur_num1 = 0;
int cur_num2 = 0;// 这两个数字分别表示两种情况下,操作二的最小次数

int ans = INT_MAX;

for (int i = 0; i < 2*n; i++) {
if ((i%2==0&&s[i]=='0')||(i%2==1&&s[i]=='1')) {
cur_num1++;
}
else {
cur_num2++;
}

if (i < n-1) continue; // 窗口大小应恰好为 n

ans = min(ans, min(cur_num1, cur_num2));

int drop_index = i-n+1;
if ((drop_index%2==0&&s[drop_index]=='0')||(drop_index%2==1&&s[drop_index]=='1')) {
cur_num1--;
}
else {
cur_num2--;
}
}

return ans;

}
};