题目
题意
给你一个01字符串,可以对其中的一段进行翻转操作,问使字符串变成01交错的字符串至少需要多少次操作
题解
- 翻转字符串不会改变翻转区间内的01关系,只会改变头和尾的关系,交换
- 找到相邻的相同的作为头,然后往后找第一个相邻的相同的且与头不相同的作为尾
- 翻转
第一种思想属于暴利,复杂度有点高,会被卡超时,因此介绍第二种思想 - 第二种思想,多出来的连续的0或1的区间长度之和的最大值
AC代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
int t; cin >> t;
int n; string s;
while(t--){
cin >> n >> s;
int vis[5];
vis[0] = vis[1] = 0;
for(int i = 0; i < n; i++){
if(s[i] == s[i + 1]) {
for (int j = i; j <= n; j++) {
if (s[j] != s[i]){
vis[s[i] - '0'] += (j - i - 1);
i = j - 1;
break;
}
}
}
}
//cout << vis[0] << vis[1] << endl;
cout << max(vis[0], vis[1]) << endl;
}
return 0;
}