满足条件的01串

我也不知道咋回事,想了很久,觉得自己没错,但又觉得缺少哪种特殊情况自己不知道,真的好烦人😭😭 感觉自己的思维还是欠缺

问了别人后,才知道没有必要一起判断0和1,因为情况很复杂;

恍然大悟,说的是呢😂

给定一个 01 串,如果同时满足下列两个条件,则输出Yes,否则输出No

  1. 不存在两个相邻的 1
  2. 每个 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");
    }
}

还有别的方法吗?可以在评论区下留言噢🤩😍

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值