描述
对01字符串进行一些操作,01字符串上的0和0相邻时会变成1,而1和1相邻时会在字符串上消失,而0和1相邻时什么都不会发生,问这个字符串最后会变成什么样。
示例1
输入:
"00110001"
返回值:
"01"
说明:
00110001→1110001→10001→1101→01
备注:
1≤∣str∣≤10^6,字符串上的合并消失应优先与左边进行,例如000,中间的0优先与左边的0合并变为10,消失同理
这个问题可以通过一个栈来解决。遍历字符串,遇到0时将其压入栈中;遇到1时,如果栈不为空且栈顶元素为0,则弹出栈顶的0并与当前1合并(不影响结果);若栈为空或栈顶元素为1,则将当前1直接输出。
以下是C++代码实现:
Cpp
#include <string>
#include <stack>
class Solution {
public:
/**
*
* @param str string字符串 初始字符串
* @return string字符串
*/
string solve(string str) {
std::stack<char> s;
std::string result;
for (char ch : str) {
if (ch == '0') {
s.push(ch);
} else { // ch == '1'
if (!s.empty() && s.top() == '0') {
s.pop(); // 合并0和1,不改变结果,所以不需要做任何操作
} else {
result += ch; // 当前1不能与栈中的0合并,或者栈为空,将1添加到结果中
}
}
}
// 处理栈中剩余的0
while (!s.empty()) {
result += '0';
s.pop();
}
return result;
}
};
该算法会正确处理题目描述中的情况,按照从左到右的顺序合并相邻的0和1,并删除相邻的1。最后返回经过这些操作后的字符串。