题目描述
给定一个字符串 s,仅含 0, 1, ? 三种字符,你必须将所有 ? 替换为 1 或 0 。
定义 s 的美好值为将所有 ?进行替换后,s的 最长连续 1 或 0 的子串的长度。请你进行所有替换后,使得字符串 s 的美好值最大,请输出这个美好值。
输入描述:
本题包含多组数据
第一行包含一个正整数 ,表示测试数据组数。
对于每组数据:
第一行包含一个正整数 ,表示字符串 sss 的长度。
接下来一行一个字符串 s,描述如题目所示,。
数据保证 。
输出描述:
对于每组数据:
输出一行一个整数,代表字符串 s 的最大美好值。
来源:牛客网
示例1
输入
5
5
01110
1
0
4
01??
3
110
3
1??
输出
3
1
3
2
3
思路:
这个题目也比较的简单,我们将其中的?全部转化成1和全部转化成0分别O(n)遍历找最长连续序列就可以
AC代码:
cpp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5+10;
int a[N];
void solve(){
int n;
cin >> n;
string s;
cin >> s;
string s1 = s,s2 = s;
for(int i = 0;i < n;i++){
if(s[i] == '?'){
s1[i] = '0';
s2[i] = '1';
}
}
int maxx = 0;
int cnt = 1;
for(int i = 1;i < n;i++){
if(s1[i] == s1[i - 1]){
cnt++;
}
else{
maxx = max(maxx,cnt);
cnt = 1;
}
}
maxx = max(maxx,cnt);
cnt = 1;
for(int i = 1;i < n;i++){
if(s2[i] == s2[i - 1]){
cnt++;
}
else{
maxx = max(maxx,cnt);
cnt = 1;
}
}
maxx = max(maxx,cnt);
cout << maxx << "\n";
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int T = 1;
cin >> T;
while(T--){
solve();
}
return 0;
}