将二进制字符串通过翻转前缀转换为另一个字符串,并使翻转次数最少
前缀是从第零个索引开始的子字符串,其长度可以是 1 到给定字符串长度的任何值。我们得到了两个二进制字符串,这意味着这两个字符串仅包含两种不同的字符,我们需要通过翻转前缀将第一个字符串转换为第二个字符串,并使翻转次数最少。此外,还给定这两个字符串的长度相等。
输入 1
string str1 = "01100" string str2 = "10101"
输出
3
解释
我们唯一可以执行的操作是选择任意长度的前缀,然后更新其值。因此,我们可以选择整个字符串,则字符串将变为 10011。现在,我们可以选择长度为字符串总长度减 1 的前缀,则字符串将变为 01101。最后,我们可以选择长度为 2 的前缀,这将给我们答案。
输入 2
string str1 = “1001” string str2 = “1000”
输出
2
思路
我们可以在这里观察到,如果我们需要通过翻转所选前缀的所有字符来更改字符串。
需要注意的是,如果我们想更改第一个字符串的最后一位,则必须选择整个字符串,然后以后就不需要再选择整个字符串了。
因此,根据这个观察结果,我们可以从最后一位遍历字符串,并检查两个字符串的当前字符是否相同。如果它们相同,则我们移动到下一个字符,否则我们将更新答案并翻转字符串。
现在,翻转整个字符串是一个代价较高的步骤,因此与其翻转整个字符串,不如使用一个变量来标记字符串是否被翻转。
如果字符串翻转一次,则字符将发生变化,但如果我们翻转字符串两次,则字符串将恢复到相同的形式。
代码实现步骤
首先,我们将创建一个主函数,并定义字符串,并调用函数以获取所需的最小步骤数。
我们的辅助函数将把两个字符串作为参数,并返回一个整数,该整数将是我们所需的数字。
在函数中,我们将获取字符串的长度并将其存储在一个变量中。
将有一个布尔变量来存储当前字符串是否被翻转。
我们将使用 for 循环从最后一个索引到第零个索引遍历字符串。
如果两个字符串的当前字符相同且字符串被翻转,或者字符不同且字符串未被翻转,则我们将答案更新为 1 并翻转字符串。
最后,我们将返回答案值,并在主函数中打印它。
示例
#include <bits/stdc++.h> using namespace std; // creating a function to find number of steps required int stepsReq(string str1, string str2){ int len = str1.length(); // getting length of the strings int ans = 0; // variable to store the answer bool isFlipped = false; // traversing over the string for(int i=len-1; i>=0; i--){ if(str1[i] == str2[i]){ if(isFlipped){ // characters are the same but the string is flipped ans++; isFlipped = false; } } else{ if(!isFlipped){ // characters are not the same and the string is not flipped isFlipped = true; ans++; } } } return ans; // return the answer } int main(){ string str1 = "01100"; // given strings string str2 = "10101"; // calling the function cout<<"The minimum number of steps required to convert the first string to another by flipping the prefixes is" <<stepsReq(str1,str2)<<endl; return 0; }
输出
The minimum number of steps required to convert the first string to another by flipping the prefixes is 2
时间和空间复杂度
上述代码的时间复杂度为 O(N),其中 N 是字符串的长度。
由于我们不使用任何额外的空间,因此上述代码的空间复杂度为 O(1)。
注意
在这个问题中,我们得到两个字符串的长度相同,因此我们没有为它编写任何条件,但如果没有给出,则我们必须为此添加一个条件,并检查如果长度不同,则返回是不可能的。
结论
在本教程中,我们实现了一个程序,通过翻转前缀将二进制字符串转换为另一个字符串,并使翻转次数最少。前缀是从第零个索引开始的子字符串,其长度可以是 1 到给定字符串长度的任何值。我们实现了一个程序,其时间复杂度为 O(N),空间复杂度为 O(1)。