Design a text editor with a cursor that can do the following:
- Add text to where the cursor is.
- Delete text from where the cursor is (simulating the backspace key).
- Move the cursor either left or right.
When deleting text, only characters to the left of the cursor will be deleted. The cursor will also remain within the actual text and cannot be moved beyond it. More formally, we have that 0 <= cursor.position <= currentText.length
always holds.
Implement the TextEditor
class:
TextEditor()
Initializes the object with empty text.void addText(string text)
Appendstext
to where the cursor is. The cursor ends to the right oftext
.int deleteText(int k)
Deletesk
characters to the left of the cursor. Returns the number of characters actually deleted.string cursorLeft(int k)
Moves the cursor to the leftk
times. Returns the lastmin(10, len)
characters to the left of the cursor, wherelen
is the number of characters to the left of the cursor.string cursorRight(int k)
Moves the cursor to the rightk
times. Returns the lastmin(10, len)
characters to the left of the cursor, wherelen
is the number of characters to the left of the cursor.
Design a Text Editor
Example 1:
Input
["TextEditor", "addText", "deleteText", "addText", "cursorRight", "cursorLeft", "deleteText", "cursorLeft", "cursorRight"]
[[], ["leetcode"], [4], ["practice"], [3], [8], [10], [2], [6]]
Output
[null, null, 4, null, "etpractice", "leet", 4, "", "practi"]
Explanation
TextEditor textEditor = new TextEditor(); // The current text is "|". (The '|' character represents the cursor)
textEditor.addText("leetcode"); // The current text is "leetcode|".
textEditor.deleteText(4); // return 4
// The current text is "leet|".
// 4 characters were deleted.
textEditor.addText("practice"); // The current text is "leetpractice|".
textEditor.cursorRight(3); // return "etpractice"
// The current text is "leetpractice|".
// The cursor cannot be moved beyond the actual text and thus did not move.
// "etpractice" is the last 10 characters to the left of the cursor.
textEditor.cursorLeft(8); // return "leet"
// The current text is "leet|practice".
// "leet" is the last min(10, 4) = 4 characters to the left of the cursor.
textEditor.deleteText(10); // return 4
// The current text is "|practice".
// Only 4 characters were deleted.
textEditor.cursorLeft(2); // return ""
// The current text is "|practice".
// The cursor cannot be moved beyond the actual text and thus did not move.
// "" is the last min(10, 0) = 0 characters to the left of the cursor.
textEditor.cursorRight(6); // return "practi"
// The current text is "practi|ce".
// "practi" is the last min(10, 6) = 6 characters to the left of the cursor.
Constraints:
1 <= text.length, k <= 40
text
consists of lowercase English letters.- At most
2 * 104
calls in total will be made toaddText
,deleteText
,cursorLeft
andcursorRight
.
Follow-up: Could you find a solution with the time complexity of O(k)
per call?
Solution:
Always maintain the left part of the string in the left stack and the right part of the string in the right stack which are divided by the cursor
1) Add operation: Push string character by character to the left stack.
2) Deletion operation: Pop characters from the left stack and return the number of characters popped.
3) Cursor movement to left: Pop elements from the left stack and push in the right stack.
4) Cursor movement to right: Pop elements from the right stack and push in the left stack.
class TextEditor {
stack<char> left;
stack<char> right;
public:
TextEditor() {
}
void addText(string text) {
for(auto &c : text){
left.push(c);
}
}
int deleteText(int k) {
int cnt=0;
while(!left.empty() and k>0){
left.pop();
cnt++;
k--;
}
return cnt;
}
string cursorLeft(int k) {
while(!left.empty() and k>0){
char c = left.top();left.pop();
right.push(c);
k--;
}
// returning the last min(10, len) characters to the left of the cursor
return cursorShiftString();
}
string cursorRight(int k) {
while(!right.empty() and k>0){
char c = right.top();right.pop();
left.push(c);
k--;
}
// returning the last min(10, len) characters to the left of the cursor
return cursorShiftString();
}
// function to return the last min(10, len) characters to the left of the cursor
string cursorShiftString(){
string rtn = "";
int cnt=10;
while(!left.empty() and cnt>0){
char c = left.top();left.pop();
rtn += c;
cnt--;
}
reverse(rtn.begin(),rtn.end());
for(int i=0;i<rtn.size();i++){
left.push(rtn[i]);
}
return rtn;
}
};
Time Complexity of each operation:addText(string text) : O(n) {where n == length of text}
deleteText(int k) : O(k)
cursorLeft(int k) : O(k)
cursorRight(int k) : O(k)
Happy Learning – If you require any further information, feel free to contact me.