將二進位制字串透過翻轉字首轉換為另一個字串,並使翻轉次數最少


字首是從第零個索引開始的子字串,其長度可以是 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)。

更新於: 2023年7月11日

183 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告