二进制编辑器
in Algorithm Pageviews
请实现一个简单的二进制编辑器,合法的二进制数字不能有前导 0,前导0定义为:从左向右第一个非0数字之前的所有0,或者全0数字的最后一个0之前的所有0。合法数字如1101,0,1,100,非法如00,01。
初始有一个二进制数字字符串(可能为空),光标默认在最后一个数字的右侧。需要支持如下操作:
0
:在光标位置插入一个数字0
,光标停留在新插入数字的右侧。如果插入会导致出现前导0,则不做任何处理。1
:在光标位置插入一个数字1
,如果出现前导0,则需要将前导0删除;光标停留在新插入数字的右侧。B
:删除光标位置左侧相邻的一个数字,光标左移一位:- 如果删除后出现前导0,需要将前导0删除,且光标停留在最左侧。
- 例如:
1001101
,光标在第一个1的右侧,进行B操作后,则数字变为1101
- 如果光标已在最左侧,则不做任何处理。
L
:光标左移一个位置,如果光标已在最左侧,则不做任何处理。R
:光标右移一个位置,如果光标已在最右侧,则不做任何处理。
现给出初始二进制数字字符串,inputStr
,以及一系列操作 cmds
,请依次进行编辑操作,最后返回编辑器内二进制数字字符串。
输入
第一个参数是 inputStr,0 <= inputStr.size() <= 1000,仅以0和1组成的二进制数字字符串,或空串""
第二个参数是一系列操作cmds,1 <= cmds.size() <= 1000,cmds[i] 仅为0、1、B、L、R之一
用例保证:1)输入不含前导0;2)在整个操作过程中,数字长度不超过 2000
输出
一个二进制数字字符串,可能为空字符串""
样例
输入样例1:
"10"
"0LLB0R1"
输出样例1:
"1"
提示
初始光标在最右侧
0操作后,字符串为100,光标仍然在最右侧
L操作后,光标在两个0之间
L操作后,光标在1右侧
B操作后,为0,光标在最左侧。注:删除1后为00(此时出现前导0),删除前导0后变为0。
0操作时,只有一个0,如果再插入0,就会出现前导0,忽略这项操作。
R操作后,光标移动到0的后面
1操作后,插入1,并把前导0删除,结果返回 1
代码实现如下:
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
void handle(string &res, int &index)
{
while ((res[0] == '0') && (res.size() > 1)) {
res = res.substr(1);
if (index > 0) {
index--;
}
}
}
string BinaryEdit(const string &inputStr, const string &cmds)
{
string str = inputStr;
int index = inputStr.size();
for (const auto & c : cmds) {
switch(c) {
case '0':
case '1':
str = str.substr(0, index) + c + str.substr(index, str.size() - index);
index++;
handle(str, index);
break;
case 'B': // 删除index处的字符
if (index != 0) {
str = str.substr(0, index - 1) + str.substr(index, str.size() - index);
index--;
handle(str, index);
}
break;
case 'L':
if (index != 0) {
index--;
}
break;
case 'R':
if (index != str.size()) {
index++;
}
break;
default:
break;
}
}
return str;
}
};