📌  相关文章
📜  通过从二进制字符串中删除所有出现的 01 和 11 获得的最小字符串| 2套

📅  最后修改于: 2021-09-05 08:53:47             🧑  作者: Mango

鉴于长度为N的二进制字符串S,任务是通过去除“01”“11”的所有匹配查找字符串最小的可能。去除任何子后,将字符串的其余部分。

例子:

基于堆栈的方法:参考上一篇文章,通过给定的操作找到可能的最小字符串的长度。
时间复杂度: O(N)
辅助空间: O(N)

空间优化方法:上述方法可以通过仅存储未删除字符的长度来进行空间优化。请按照以下步骤解决问题:

  • 初始化一个变量,比如st0,以存储可能的最小字符串的长度。
  • 迭代字符串S的字符并执行以下步骤:
    • 如果st大于0并且S[i]等于“ 1 ”,则通过将st1 来弹出最后一个元素。
    • 否则,将st增加1。
  • 最后,完成上述步骤后,打印st 中得到的答案。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
  
// Function to find the length of
// the smallest string possible by 
// removing substrings "01" and "11"
int shortestString(string S, int N)
{
    // Stores the length of
    // the smallest string
    int st = 0;
  
    // Traverse the string S
    for (int i = 0; i < N; i++) {
  
        // If st is greater
        // than 0 and S[i] is '1'
        if (st && S[i] == '1') {
  
            // Delete the last
            // character and
            // decrement st by 1
            st--;
        }
  
        // Otherwise
        else {
  
            // Increment st by 1
            st++;
        }
    }
  
    // Return the answer in st
    return st;
}
  
// Driver Code
int main()
{
    // Input
    string S = "1010";
  
    int N = S.length();
  
    // Function call
    cout << shortestString(S, N);
    return 0;
}


输出:
2

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

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