实现文本编辑器

solve actually problem

有一个简易的文本编辑器,初始为空行,光标默认在行首,且默认小写,请实现下面的功能。

  • a-z 按下键盘键对应的 26 个字母键,在光标位置输入一个字符。
  • @ 表示切换大小写
  • + 表示在光标位置换行 把光标右侧的内容作为新行插入在当前行之后。
  • ~ 表示回车键 可删除光标左侧字符,当光标在行首时,将当前行拼接到上一行(如果存在),拼接到当前行行尾。
  • - 表示删除键 可删除光标右侧的字符,当光标在行尾时,将下一行(如果存在)拼接到当前行的行尾。
  • ^*<> 分别表示上下左右 方向键。
    • 左右移动,光标横向移动位置
      • 当光标在行首时,左移到上一行(如果存在)行尾。
      • 当光标在行尾时,右移到下一行(如果存在)行首。
    • 上下移动,光标纵向移动一行
      • 若在首行上移,或在末行下移,则移动无效。
      • 相邻行:如果目标行内容长度小于光标的位置,则光标移动到目标行行尾。注意:仅根据当前光标的列位置来移动,不记忆之前的位置。

请根据键盘信息 inputStr,输出最终的文本内容。

输入:

inputStr仅包含小写字母 a-z 以及功能字符 +~-@^*<>,1 <= inputStr.size() < 1024

输出:

字符串列表,每个元素表示一行内容(注意:空行 “” 不能忽略)。

样例1

输入:

aaaa+bbbb~@cc<<<^--d@d

输出:

["aaDd", "bbbCC"]

解释:

初始为空行,光标在行首。

样例2

输入:

za+b+cd^*e^^~*~>>~

输出:

["abced"]

代码实现如下:

class Solution {
public:
    int pos = 0;
    int line = 0;
    bool isLower = true;
    vector<string> res{""};

    void AddLine()
    {
        auto preStr = res[line].substr(0, pos);
        auto endStr = res[line].substr(pos);
        res[line] = preStr;
        res.insert(res.begin() + line + 1, endStr);
        line++;
        pos = 0;
    }

    void AddWord(char c)
    {
        res[line].insert(pos++, 1, isLower ? tolower(c) : toupper(c));
    }

    void BackBlankProc()
    {
        if (pos == 0) {
            if (line == 0) {
                return;
            }
            
            pos = res[line - 1].size();
            res[line - 1] += res[line];
            line--;
            return;
        }
        
        auto &tempStr = res[line];
        tempStr.erase(tempStr.begin() + pos - 1);
        pos--;
    }
    
    void DeleteProc()
    {
        if (pos == res[line].size()) {
            if (line == res.size() - 1) {
                return;
            }
            
            res[line] += res[line + 1];
            res.erase(res.begin() + line + 1);
            return;
        }
        
        res[line].erase(res[line].begin() + pos);
    }
    
    void SetUp()
    {
        if (line == 0) {
            return;
        }
        
        if (pos > res[line - 1].size()) {
            pos = res[line - 1].size();
        }
        line--;
    }
    
    void SetDown()
    {
        if (line == res.size() - 1) {
            return;
        }
        
        if (pos > res[line + 1].size()) {
            pos = res[line + 1].size();
        }
        line++;
    }
    
    void SetLeft()
    {
        if (pos == 0) {
            if (line == 0) {
                return;
            }
            pos = res[line - 1].size();
            line--;
            return;
        }
        
        pos--;
    }
    
    void SetRight()
    {
        if (pos == res[line].size()) {
            if (line == res.size() - 1) {
                return;
            }
            
            pos = 0;
            line++;
            return;
        }
        pos++;
    }
    
    void CharPos(char c)
    {
        switch (c) {
            case '@':
                isLower = !isLower;
                break;
            case '+':
                AddLine();
                break;
            case '~':
                BackBlankProc();
                break;
            case '-':
                DeleteProc();
                break;
            case '^':
                SetUp();
                break;
            case '*':
                SetDown();
                break;
            case '<':
                SetLeft();
                break;
            case '>':
                SetRight();
                break;
            default:
                AddWord(c);
                break;
        }
    }
    
    vector<string> StrEdit(const string &inputStr)
    {
        for (auto c : inputStr) {
            CharProc(c);
        }
        return res;
    }
};