实现文本编辑器
in Algorithm Pageviews
有一个简易的文本编辑器,初始为空行,光标默认在行首,且默认小写,请实现下面的功能。
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;
}
};