我也不知道咋回事,想了很久,觉得自己没错,但又觉得缺少哪种特殊情况自己不知道,真的好烦人😭😭 感觉自己的思维还是欠缺
问了别人后,才知道没有必要一起判断0和1,因为情况很复杂;
恍然大悟,说的是呢😂
给定一个 01 串,如果同时满足下列两个条件,则输出Yes
,否则输出No
:
- 不存在两个相邻的 1
- 每个 0 两边至少有一个 1
输入格式
第一行包含整数 T,表示共有 T 组测试数据。
每组数据第一行包含整数 n。
第二行包含一个长度为 n 的 01 字符串。
输出格式
每组数据输出一行结果,如果同时满足两个条件,输出 Yes
,否则输出 No
。
数据范围
前三个测试点满足,1≤n≤100
所有测试点满足,1≤T≤10,1≤n≤1000
同一测试点内,所有 n相加之和不超过 1000。
输入样例:
3
3
101
4
1011
5
10001
输出样例:
Yes
No
No
上代码
方法一:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int n,t;
char s[N];
int main()
{
cin>>t;
while(t--)
{
cin>>n;
cin>>(s+1);
bool res = true;
for (int i = 2; i <= n; i ++ )
if (s[i] == '1' && s[i - 1] == '1')
res = false;
for (int i = 1; i <= n; i ++ )
if (s[i] == '0' && s[i - 1] != '1' && s[i + 1] != '1')
res = false;
if (res) puts("Yes");
else puts("No");
}
return 0;
}
是不是很简单呢?
方法二:特判下首尾,接着枚举所有情况(起初我也是这样写的,但是少了判断首部的情况,结果
WA了,,,,hhh,不爽)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 1;
int n;
int main(){
int T;
cin >> T;
while(T --){
char s[N];
int n;
bool flag = true;
cin >> n;
scanf("%s", s);
if(n == 1 && s[0] == '1'){puts("Yes"); continue;}
if(n == 1 && s[0] == '0'){puts("No"); continue;}
int l = strlen(s);
for(int i = 0;i < l;i ++){
if(i == 0){
if(s[i] == '0' && s[i + 1] == '0') {flag = false; break;}
}
if(i == l - 1){
if(s[i] == '0' && s[i - 1] == '0') {flag = false; break;}
}
if(s[i] == '1'){
if(s[i + 1] == '1' || s[i - 1] == '1') {flag = false; break;}
}
else{
if(s[i + 1] == '0' && s[i - 1] == '0'){flag = false; break;}
}
}
if(flag == true) puts("Yes");
else puts("No");
}
}
还有别的方法吗?可以在评论区下留言噢🤩😍