經過M次迭代後,將所有01或10轉換為11,從而找到二進位制字串
二進位制字串是由僅兩種不同字元組成的字串,即'0'和'1'。我們將得到一個二進位制字串和數字m。我們必須應用操作將所有連續出現的'01'和'10'轉換為'11'。還有一個條件是'0'只有一個鄰居可以是'1'。我們最多隻能遍歷字串m次,其中m是給定的。
讓我們透過以下示例來理解
Input 1: Given binary string: ‘01000101’ Given number: 2 Output: 111011101
解釋
我們將首先遍歷字串,並可以更改恰好只有一個'1'作為鄰居的零,這使得我們的字串變為'111011101'。在第二次迭代中,字串將保持不變,因為沒有零恰好只有一個'1'作為鄰居。
Input 2: Given binary string: ‘00100’ Given number: 1000 Output: 11111
解釋
第一次迭代後,我們將得到01110,第二次迭代後,我們將得到11111。對於其餘的迭代,字串將不會發生變化。
方法
我們已經看到了上面給定字串的示例,讓我們來看一下方法:
首先,我們將建立一個函式,該函式將給定的字串和數字作為引數,並將所需的字串作為返回值。
在函式中,我們將找到字串長度和給定迭代次數中的最小值,因為字串在給定迭代次數內將發生最大變化。
然後,我們將迭代給定迭代次數的字串,並在每次迭代中找到零。
如果零位於兩個一或零之間,我們將移動,否則我們將零更新為一,然後移動到該位置。
從主函式中,我們將呼叫該函式,並在呼叫該函式後列印最終答案。
示例
#include <iostream> using namespace std; string updateString(string str, int m){ // using the optimal concept to reduce the number of iterations int n = str.size(); // getting the size of the string m = min(m,n); // getting the minimum value // iterating using a while loop while(m--){ // iterating over the string for(int i=0; i<n; i++){ if(str[i] == '0'){ if(i == 0){ if(str[i+1] == '1'){ str[i] = '1'; } } else if(i == n-1){ if(str[i-1] == '1'){ str[i] = '1'; } } else{ if((str[i-1] == '1' || str[i+1] == '1') && (str[i-1] != str[i+1])){ str[i] = '1'; } } } } } // returning the string return str; } // main function int main(){ string str = "01000101";// given string int m = 2; // given number // calling the function to update the string string update_str = updateString(str, m); cout<<"The given string "<< str << " after " << m << " number of iterations is "<< update_str<<endl; return 0; }
輸出
The given string 01000101 after 2 number of iterations is 11110101
時間和空間複雜度
上述程式碼的時間複雜度為O(min(M, N)*N),其中N是字串的大小,M是我們對字串執行的總迭代次數。
上述程式碼的空間複雜度為O(N),因為我們將字串作為引數傳遞給給定函式。
使用標誌方法
在之前的方法中,我們迭代了M或字串長度的最小值次數的字串。我們可以透過使用標誌來標記字串沒有改變來降低時間複雜度。
示例
#include <iostream> using namespace std; string updateString(string str, int m){ // using the optimal concept to reduce the number of iterations int n = str.size(); // getting the size of the string m = min(m,n); // getting the minimum value bool flag = true; // iterating using while loop while(m-- && flag){ flag = false; // marking the flag as false // iterating over the string for(int i=0; i<n; i++){ if(str[i] == '0'){ if(i == 0){ if(str[i+1] == '1'){ str[i] = '1'; flag = true; } } else if(i == n-1){ if(str[i-1] == '1'){ str[i] = '1'; flag = true; } } else{ if((str[i-1] == '1' || str[i+1] == '1') && (str[i-1] != str[i+1])){ str[i] = '1'; flag = true; } } } } } // returning the string return str; } // main function int main(){ string str = "00100";// given string int m = 1000; // given number // calling the function to update the string string update_str = updateString(str, m); cout<<"The given string "<< str << " after " << m << " number of iterations is "<< update_str<<endl; return 0; }
輸出
The given string 00100 after 1000 number of iterations is 11111
結論
在本教程中,我們實現了一個程式,用於在M次迭代後透過將所有01或10轉換為11來查詢二進位制字串。我們實現了一種時間複雜度為O(min(M, N)*N)和空間複雜度為O(N)的方法,其中N是字串的大小,M是給定的整數(我們必須執行的總迭代次數)。此外,我們使用了標誌來減少如果字串沒有改變的迭代次數。