二进制编辑器

solve actually problem!

请实现一个简单的二进制编辑器,合法的二进制数字不能有前导 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;
    }
};