鉴于长度为N的二进制字符串S,任务是通过去除串的“01”和“11”的所有匹配查找字符串最小的可能。去除任何子后,将字符串的其余部分。
例子:
Input: S = “1010”
Output: 2
Explanation: Removal of substring “01” modifies string S to “10”.
Input: S = “111”
Output: 1
基于堆栈的方法:参考上一篇文章,通过给定的操作找到可能的最小字符串的长度。
时间复杂度: O(N)
辅助空间: O(N)
空间优化方法:上述方法可以通过仅存储未删除字符的长度来进行空间优化。请按照以下步骤解决问题:
- 初始化一个变量,比如st为0,以存储可能的最小字符串的长度。
- 迭代字符串S的字符并执行以下步骤:
- 如果st大于0并且S[i]等于“ 1 ”,则通过将st减1 来弹出最后一个元素。
- 否则,将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