0

0

检查一个二进制字符串是否可以通过删除非相邻字符来按降序排序

王林

王林

发布时间:2023-09-09 18:33:03

|

952人浏览过

|

来源于tutorialspoint

转载

检查一个二进制字符串是否可以通过删除非相邻字符来按降序排序

在这个问题中,我们需要通过仅删除不相邻的元素来按降序对给定的二进制字符串进行排序。

为了解决这个问题,我们需要删除二进制字符串中所有位于 1 之前的 0。如果我们在字符串中的任何位置发现两个连续的零后面有两个连续的1,则意味着我们无法对字符串进行降序排序。否则,我们可以针对每种情况进行分类。

问题陈述 - 我们给定了长度等于 N 的二进制字符串 str。我们需要检查是否可以通过从字符串中删除多个不相邻的字符来按降序对给定字符串进行排序。给定的字符串。如果字符串可以降序排序,则打印“yes”;否则,打印“否”。

示例

Input –  str = "10101100"
Output – “YES”

说明

我们可以从第二个和第四个位置删除“0”,以降序对字符串进行排序。

Input –  str = "11000"
Output – “YES”

说明

字符串已经排序。

Input –  str = “010001100”
Output – “NO”

说明

这里,我们需要去掉第1、3、4、5个位置的0来对字符串进行排序,但不能去掉相邻的0。另外,我们可以通过删除所有“1”来对字符串进行排序,但这也是不可能的,因为两个“1”是相邻的。

方法 1

在这种方法中,我们将从末尾开始遍历字符串。如果我们找到两个连续的“1”,则打破循环。之后,我们检查字符串是否包含两个连续的“0”。如果是,我们返回 false。否则,我们返回 true。

算法

  • 步骤 1 - 开始使用 for 循环从 'len – 2' 到 0 遍历字符串。这里,'len' 是给定二进制字符串的长度。

  • 步骤 2 - 如果 str[i] 和 str[i+1] 都等于“1”,则使用“break”关键字终止循环。

  • 第 3 步 - 现在,开始从第 i 个索引开始遍历字符串。

  • 步骤 4 - 如果 str[j] 和 str[j+1] 都等于 '0',则返回 0。如果循环成功终止,则返回 1。 p>

  • 第 5 步 - 根据 isSortPossible() 函数的返回值在驱动程序代码中打印“YES”或“NO”。

    企奶奶
    企奶奶

    一款专注于企业信息查询的智能大模型,企奶奶查企业,像聊天一样简单。

    下载

示例

#include 
using namespace std;
// removing the non-adjacent characters from the given string to make it sorted in descending order
bool isSortPossible(string str, int len){
   int i, j;
   
   // Traverse the string str from the end
   for (i = len - 2; i >= 0; i--){
   
      // if str[i] and str[i + 1] is equal to 1 then break the loop.
      if (str[i] == '1' && str[i + 1] == '1'){
         break;
      }
   }
   
   // start traversing the string from i
   for (int j = i; j >= 0; j--){
      // If str[j] and str[j + 1] is equal to 0 then return false
      if (str[j] == '0' && str[j + 1] == '0'){
         return 0;
      }
   }
   return 1;
}
int main(){
   string str = "10101100";
   int len = str.length();
   cout << "The sorting of the given binary string is possible by removing non-adjacent characters - " << endl;
   if (isSortPossible(str, len))
      cout << "YES" << endl;
   else
      cout << "NO" << endl;

   return 0;
}

输出

The sorting of the given binary string is possible by removing non-adjacent characters −
YES

时间复杂度 - O(N),当我们迭代字符串时。

空间复杂度 - O(1)

方法2

在这种方法中,我们将使用与第一种方法相同的逻辑,但我们优化了代码以使其更具可读性。在这里,我们将仅使用单个循环,而不是使用两个单独的循环来检测两个连续“0”后的两个连续“1”。

算法

  • 第 1 步 - 定义“isTwoZeros”变量并使用“false”值进行初始化。

  • 第 2 步 - 开始从第 0 个索引到“len – 1”迭代字符串。

  • 步骤 3 - 如果 str[i] 和 str[I + 1] 为“0”且“isTwoZeros”等于 false,则将“isTwoZeros”的值更改为 true 。这意味着我们在给定的字符串中得到了两个连续的零。

  • 步骤 4 - 在 else 部分,如果 str[i] 和 str[I + 1] 为 '1' 并且 'isTwoZeros' 等于 true,则从功能。这意味着我们在两个连续的零之后得到了两个连续的“1”。

  • 第 5 步 - 当 for 循环的所有迭代终止时返回 true。

示例

#include 
using namespace std;
// removing the non-adjacent characters from the given string to make it sorted in descending order
bool isSortPossible(string str, int len){
   // to track if there are two adjacent zeros in the string
   bool isTwoZeros = false;
   
   // traverse the string
   for (int i = 0; i < len - 1; i++){
   
      // if two zeros are adjacent, then change the value of isTwoZeros to true
      if (str[i] == '0' && str[i + 1] == '0' && !isTwoZeros){
         isTwoZeros = true;
      }
      else{
      
         // if we find two adjacent ones after finding two adjacent zeros, then return false
         if (str[i] == '1' && str[i + 1] == '1' && isTwoZeros){
            return false;
         }
      }
   }
   
   // return true if we don't find two adjacent ones after finding two adjacent zeros
   return true;
}
int main(){
   string str = "101001100";
   int len = str.length();
   cout << "The sorting of the given binary string is possible by removing non-adjacent characters - " << endl;
   if (isSortPossible(str, len))
      cout << "YES" << endl;
   else
      cout << "NO" << endl;

   return 0;
}

输出

The sorting of the given binary string is possible by removing non-adjacent characters - 
NO

时间复杂度 - O(N)

空间复杂度 - O(1)

结论

我们学习了两种通过仅删除不相邻字符来按降序对二进制字符串进行排序的方法。两种方法都使用相同的逻辑,对代码的更改最少。第二种方法的代码比第一种方法的代码更具可读性。

相关专题

更多
java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

118

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

256

2025.10.24

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

258

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

208

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1465

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

619

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

550

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

545

2024.04.29

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 3.2万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

【李炎恢】ThinkPHP8.x 后端框架课程
【李炎恢】ThinkPHP8.x 后端框架课程

共50课时 | 4.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号