📌  相关文章
📜  使一个字符串等于另一个字符串所需的相邻字符的最少翻转或交换

📅  最后修改于: 2021-09-07 04:09:11             🧑  作者: Mango

给定两个长度为N 的二进制字符串AB ,任务是通过翻转A 的任何字符或交换A最小次数的相邻字符来将字符串A转换为B。如果不可能使两个字符串相等,则打印-1

例子:

做法:思路是遍历字符串A ,通过先检查相邻字符的交换条件,尝试使相同索引的字符相等。如果此操作无法使字符相等,则翻转字符。请按照以下步骤解决问题:

  • 初始化一个变量,比如ans,以存储所需的结果。
  • 使用变量遍历字符串A ,比如i ,并执行以下操作:
    • 如果A[i]等于B[i],则继续循环中的下一次迭代。
    • 否则,如果A[i]等于B[i + 1]并且A[i + 1]等于B[i] ,则交换字符并将ians增加1
    • 否则,如果A[i]不等于B[i] ,则翻转当前位并将ans增加1
  • 打印ans的值作为结果。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
  
// Function to find minimum operations
// required to convert string A to B
int minimumOperation(string a, string b)
{
  
    // Store the size of the string
    int n = a.length();
    int i = 0;
  
    // Store the required result
    int minoperation = 0;
  
    // Traverse the string, a
    while (i < n) {
  
        // If a[i] is equal to b[i]
        if (a[i] == b[i]) {
            i = i + 1;
            continue;
        }
  
        // Check if swapping adjacent
        // characters make the same-indexed
        // characters equal or not
        else if (a[i] == b[i + 1]
                 && a[i + 1] == b[i]
                 && i < n - 1) {
  
            minoperation++;
            i = i + 2;
        }
  
        // Otherwise, flip the current bit
        else if (a[i] != b[i]) {
            minoperation++;
            i = i + 1;
        }
        else {
            ++i;
        }
    }
  
    // Print the minimum number of operations
    cout << minoperation;
}
  
// Driver Code
int main()
{
    // Given Input
    string a = "10010010", b = "00001000";
  
    // Function Call
    minimumOperation(a, b);
  
    return 0;
}


输出:
3

时间复杂度: O(N)
辅助空间: O(1)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live