搜索
首页后端开发C++将给定的二进制字符串转换为另一个二进制字符串,最少操作数为翻转除一个以外的所有位

将给定的二进制字符串转换为另一个二进制字符串,最少操作数为翻转除一个以外的所有位

在这个问题中,我们需要通过翻转字符串的字符,将一个二进制字符串转换为另一个二进制字符串。我们可以保存任何设置的位并翻转其他位,并且我们需要计算总操作以通过这样做来实现另一个字符串。

我们可以根据给定字符串中“01”和“10”对的总数来解决问题。

问题陈述- 我们给出了两个长度相同的字符串,分别名为 str1 和 str2,包含“0”和“1”字符,表示二进制字符串。我们需要通过执行以下操作将字符串 str1 转换为 str2。

  • 我们可以选择任何设置的位并翻转所有其他位。翻转位意味着将“0”转换为“1”,将“1”转换为“0”。

  • 如果无法将 str1 转换为 str2,则打印 -1。

示例

输入

str1 = "001001111", str2 = "011111000";

输出

3

解释

  • 在第一个操作中,我们保持第二个索引的“1”不变,并翻转 str1 中的所有其他字符。因此,str1 将是 111110000。

  • 在第二个操作中,我们保持第 0 个索引的“1”不变,并翻转所有其他字符。因此,str1 将是 100001111。

  • 在最后一个操作中,我们将“1”保存在第 5 个索引处。因此,str1 将变为 011111000。

输入

 str1 = "0000", str2 = "1111";

输出

-1

解释- 无法将 str1 转换为 str2,因为 str1 不包含任何要保存的“1”字符。

输入

 str1 = "0111", str2 = "1000";

输出

-1

说明- 无法将 str1 转换为 str2。

方法 1

我们可以通过观察来解决问题。观察结果是,当我们持有任何单个设置位并执行 2 个操作时,我们可以获得相同的字符串。因此,我们需要选择不同的1索引来对字符串进行更改。

此外,我们需要执行 2 次操作才能将 01 对转换为 10。例如,将“1”保留在“01”中。所以,我们得到“11”。之后,将“1”保留在“11”中的第 0 个索引处,这样我们就会得到“10”。

要得到答案,01 ( 0 -> str1, 1 -> str2) 和 10 ( 1 -> str1, 0 -> str2) 应该是相同的。否则,我们可以说答案不存在。

我们的主要目标是最小化“01”和“10”对,因为我们可以通过 2 次操作将“01”转换为“10”。

算法

第 1 步- 定义totalOperatrions() 函数来计算将str1 转换为str2 所需的操作数。

步骤 1.2 - 初始化 count10 和 count01 变量以将“01”和“10”对存储在字符串中。

步骤 1.3 - 遍历字符串并计算两个字符串中的 01 和 10 对。

步骤 1.4− 如果 count10 和 count01 相同,则返回 2*count10。否则返回-1。

第 2 步- 定义minimumOperations() 函数来计算将 str1 转换为 str2 所需的最少操作。

第 3 步- 用最大值初始化“ans”。

第 4 步- 使用原始字符串调用totalOperations() 函数,并将结果存储在“operation1”变量中。如果返回值不等于-1,则将ans和操作1中的最小值存储在ans中。

第 5 步- 现在,我们将修改字符串以最小化 01 和 10 对。因此,定义 stringModification() 函数。

步骤 5.1 - 在函数中,我们找到字符串中的第一对“1ch”,并将“ch”作为参数传递,可以是“0”或“1”。因此,该对应该类似于 1 -> str1 和 ch -> str。

步骤 5.2- 如果未找到“1ch”对,则返回 false。

步骤 5.3 − 如果找到“1ch”对,则保持该对不变并翻转 str1 的其他字符。

第 6 步- 执行 stringModification 函数以保持“11”对不变并翻转其他字符。之后,再次调用totalOperations()函数来查找将str1转换为str2所需的操作。

第 7 步− 如果操作 2 不等于 -1,则将“ans”或“1 + 操作 2”中的最小值存储在“ans”中。这里,我们添加了 1,因为我们使用了一次操作修改了字符串。

第 8 步- 通过保持第一个“10”对不变来修改字符串,并计算操作数。再次为“ans”分配最小值。

步骤 9− 如果“ans”等于 INT_MAX,则返回 −1。否则,返回 ans。

示例

#include <bits/stdc++.h>
using namespace std;

// counting 01 and 10 pairs
int totalOperations(string str1, string str2) {
    int len = str1.size();
    int count10 = 0, count01 = 0;
    for (int p = 0; p < len; p++) {
        // If characters at p index are not same
        if (str1[p] != str2[p]) {
            // Increase count01 if 0(str1)-1(str2), else count10 if 1(str1)-0(str2)
            if (str1[p] == '0')
                count01++;
            else
                count10++;
        }
    }
    // If we have euqal number of 01 and 10 pairs, we need 2 operations to flip one pair.
    if (count01 == count10)
        return 2 * count01;
    return -1;
}
bool StringModification(string &temp1, string &temp2, char ch) {
    int len = temp1.size();
    int index = -1;
    // Find the pair of 1c character. (1 -> temp1, c -> temp2)
    for (int p = 0; p < len; p++) {
        if (temp1[p] == '1' && temp2[p] == ch) {
            index = p;
            break;
        }
    }
    // return 0 if pair is not found
    if (index == -1)
        return false;
    // Flip other characters in both strings
    for (int p = 0; p < len; p++) {
        if (p != index) {
            if (temp1[p] == '1')
                temp1[p] = '0';
            else
                temp1[p] = '1';
        }
    }
    return true;
}
// finding minimum operations
int minimumOperations(string str1, string str2) {
    int ans = INT_MAX;
    // first case with initial strings
    int operation1 = totalOperations(str1, str2);
    if (operation1 != -1)
        ans = min(ans, operation1);
    string temp1 = str1, temp2 = str2;
    // Case 2, modification for 11 pair
    if (StringModification(temp1, temp2, '1')) {
        // get operations after modification
        int operation2 = totalOperations(temp1, temp2);
        // adding 1 to operation2 as we have done one modification initially
        if (operation2 != -1)
            ans = min(ans, 1 + operation2);
    }
    // Case 3 modification for 10 pair
    temp1 = str1, temp2 = str2;
    if (StringModification(temp1, temp2, '0')) {
        int operation3 = totalOperations(temp1, temp2);
        if (operation3 != -1)
            ans = min(ans, 1 + operation3);
    }
    if (ans == INT_MAX)
        return -1;
    else
        return ans;
}
int main() {
    string str1 = "001001111";
    string str2 = "011111000";
    int ans = minimumOperations(str1, str2);
    if (ans == -1){
        cout << "S1 to S2 conversion is not possible";
    }
    else{
        cout << "Minimum number of operations required are: " << ans << "\n";
    }
    return 0;
}

输出

Minimum number of operations required are: 3

时间复杂度− O(N),因为我们在 stringModification() 和totalOperations() 函数中遍历字符串。

空间复杂度− O(1),因为我们修改相同的字符串而不使用任何额外的空间。

在代码中,我们的主要目的是在修改字符串后,减少给定字符串中01和10对的数量,以尽量减少操作。程序员可以使用各种输入并尝试理解答案。

以上是将给定的二进制字符串转换为另一个二进制字符串,最少操作数为翻转除一个以外的所有位的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:tutorialspoint。如有侵权,请联系admin@php.cn删除
如何在Python中将DateTime转换为整数?如何在Python中将DateTime转换为整数?Sep 05, 2023 pm 10:21 PM

日期和时间值的操作是编程的一个重要方面,Python语言为此提供了一个有用的内置模块,称为datetime。但是,在某些情况下,可能需要将DateTime对象转换为整数值,以便执行特定的操作或计算。在Python中将DateTime转换为整数有多种方法,每种方法都有自己的优点和缺点。在本文中,我们将深入研究这些方法并检查每种方法何时适合使用。读完本文后,您将全面了解如何在Python中有效地将DateTime对象转换为整数,并能够为您的特定编程任务选择最合适的方法。方法一:使用timestamp

Python中的XML数据转换为CSV格式Python中的XML数据转换为CSV格式Aug 11, 2023 pm 07:41 PM

Python中的XML数据转换为CSV格式XML(ExtensibleMarkupLanguage)是一种可扩展标记语言,常用于数据的存储和传输。而CSV(CommaSeparatedValues)则是一种以逗号分隔的文本文件格式,常用于数据的导入和导出。在处理数据时,有时需要将XML数据转换为CSV格式以便于分析和处理。Python作为一种功能强大

你将如何将MATLAB代码转换为Python代码?你将如何将MATLAB代码转换为Python代码?Aug 19, 2023 pm 10:53 PM

MATLAB是一种广泛应用于工程和科学领域的流行编程语言,但由于其灵活性和适应性,Python正迅速成为许多程序员的首选语言。如果您想将MATLAB代码转换为Python代码,一开始可能会感到非常困难。然而,通过正确的知识和方法,您可以使这个过程变得更加容易。以下是一些步骤,帮助您将MATLAB代码转换为Python:步骤1:熟悉Python语法Python和MATLAB具有独特的语法,因此在开始转换代码之前,您需要熟悉Python语法。花一些时间了解Python语法基础知识,包括变量、数据类型

如何将IPython笔记本转换为PDF和HTML?如何将IPython笔记本转换为PDF和HTML?Sep 08, 2023 pm 08:33 PM

IPython笔记本是一种非常流行的科学计算和数据分析工具,被研究人员、分析师和程序员广泛使用。通过允许用户将代码、文本和交互式可视化集成到单个文档中,它们使探索数据、开发模型和交流结果变得简单。然而,与其他人共享IPython笔记本可能很困难,特别是当接收者缺乏运行它们所需的软件或专业知识时。应对这一挑战的一个解决方案是将IPython笔记本转换为PDF和HTML,它们受到普遍支持,并且可以在任何设备上轻松访问。在本文中,我们将深入研究将IPython笔记本转换为PDF和HTML的三种方法,其

使用json.Marshal函数将结构体转换为JSON字符串使用json.Marshal函数将结构体转换为JSON字符串Jul 24, 2023 pm 12:54 PM

使用json.Marshal函数将结构体转换为JSON字符串在Go语言中,可以使用json.Marshal函数将结构体转换为JSON字符串。结构体是一种由多个字段组成的数据类型,而JSON是一种常用的轻量级数据交换格式。将结构体转换为JSON字符串可以方便地在不同系统之间交换数据。下面是一个示例代码:packagemainimport(&q

在C语言中将字符串转换为大写字母在C语言中将字符串转换为大写字母Aug 30, 2023 pm 09:01 PM

这是一个将字符串转换为大写字母的C语言程序示例:示例#include<stdio.h>#include<string.h>intmain(){&nbsp;&nbsp;chars[100];&nbsp;&nbsp;inti;&nbsp;&nbsp;printf("Enterastring:");&nbsp;&nbsp;gets(s);&nbsp;&nbsp;for(i=0;s

Golang函数的byte、rune和string类型转换技巧Golang函数的byte、rune和string类型转换技巧May 17, 2023 am 08:21 AM

在Golang编程中,byte、rune和string类型是非常基础、常见的数据类型。它们在处理字符串、文件流等数据操作时发挥着重要作用。而在进行这些数据操作时,我们通常需要对它们进行相互的转换,这就需要掌握一些转换技巧。本文将介绍Golang函数的byte、rune和string类型转换技巧,旨在帮助读者更好地理解这些数据类型,并能够熟练地在编程实践中应用

使用PHP函数 "htmlspecialchars" 转换特殊字符为HTML实体使用PHP函数 "htmlspecialchars" 转换特殊字符为HTML实体Jul 24, 2023 pm 06:27 PM

使用htmlspecialchars函数转换特殊字符为HTML实体在PHP开发中,经常需要将用户输入或者从数据库中查询出的数据输出到前端页面中。然而,有些特殊字符在HTML中有特殊的含义,如果不进行处理,可能会导致页面显示异常甚至安全问题。为此,PHP提供了一个内置函数htmlspecialchars来将特殊字符转换为HTML实体,以确保数据在页面中正常显示

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中