Table of Contents
Problem Statement
Design Browser History LeetCode Solution – You have a browser with one tab where you start on the homepage and you can visit another url, get back in the history number of steps or move forward in the history number of steps.
Implement the BrowserHistory class:
BrowserHistory(string homepage)Initializes the object with thehomepageof the browser.void visit(string url)Visitsurlfrom the current page. It clears up all the forward history.string back(int steps)Movestepsback in history. If you can only returnxsteps in the history andsteps > x, you will return onlyxsteps. Return the currenturlafter moving back in history at moststeps.string forward(int steps)Movestepsforward in history. If you can only forwardxsteps in the history andsteps > x, you will forward onlyxsteps. Return the currenturlafter forwarding in history at moststeps.
Input:
["BrowserHistory","visit","visit","visit","back","back","forward","visit","forward","back","back"]
[["leetcode.com"],["google.com"],["facebook.com"],["youtube.com"],[1],[1],[1],["linkedin.com"],[2],[2],[7]]
Output:
[null,null,null,null,"facebook.com","google.com","facebook.com",null,"linkedin.com","google.com","leetcode.com"]
Explanation:
BrowserHistory browserHistory = new BrowserHistory("leetcode.com");
browserHistory.visit("google.com"); // You are in "leetcode.com". Visit "google.com"
browserHistory.visit("facebook.com"); // You are in "google.com". Visit "facebook.com"
browserHistory.visit("youtube.com"); // You are in "facebook.com". Visit "youtube.com"
browserHistory.back(1); // You are in "youtube.com", move back to "facebook.com" return "facebook.com"
browserHistory.back(1); // You are in "facebook.com", move back to "google.com" return "google.com"
browserHistory.forward(1); // You are in "google.com", move forward to "facebook.com" return "facebook.com"
browserHistory.visit("linkedin.com"); // You are in "facebook.com". Visit "linkedin.com"
browserHistory.forward(2); // You are in "linkedin.com", you cannot move forward any steps.
browserHistory.back(2); // You are in "linkedin.com", move back two steps to "facebook.com" then to "google.com". return "google.com"
browserHistory.back(7); // You are in "google.com", you can move back only one step to "leetcode.com". return "leetcode.com"Explanation
Looking at the constraints of adding and removing elements (web page being visited in this case) we can come up with a data structure which is :
- Ordered
- Keeps track of its next value and previous value ( For forwarding and backward operation )
- Easy to append elements at the top ( For visit operation )
So there is one data structure that can fulfill all these i.e Doubly Linked List.
So we create a doubly linked list whose head will always point to the current page at which the browser is.
Garbage collector/ARC will only free memory when nothing is pointing to a particular memory. It doesn’t require that memory not to point to another memory, that’s fine. It just requires, that there should not be any reference to that memory [to be collected/freed].
But in this case of a doubly-linked list, if we do not make the previous ref as (week reference), a deadlock might occur.
A <—> B [removing point] <—> C <—> D <—> E
after this also
C <—> D <—> E, this will exist
Code
C++ Code for Design Browser History
class BrowserHistory {
public:
string stack[5005];
int p, t; // current pointer, stack's top
BrowserHistory(string homepage) {
stack[p = t = 0] = homepage;
}
void visit(string url) {
stack[t = ++p] = url;
}
string back(int steps) {
return stack[p = max(0, p-steps)];
}
string forward(int steps) {
return stack[p = min(t, p+steps)];
}
};Java Code for Design Browser History
class BrowserHistory {
public class Node{
String url;
Node next, prev;
public Node(String url) {
this.url = url;
next = null;
prev = null;
}
}
Node head, curr;
public BrowserHistory(String homepage) {
head = new Node(homepage);
curr = head;
}
public void visit(String url) {
Node node = new Node(url);
curr.next = node;
node.prev = curr;
curr = node;
}
public String back(int steps) {
while (curr.prev != null && steps-- > 0) {
curr = curr.prev;
}
return curr.url;
}
public String forward(int steps) {
while (curr.next != null && steps-- > 0) {
curr = curr.next;
}
return curr.url;
}
}Complexity Analysis for Design Browser History LeetCode Solution
Time Complexity
O(N)
Space Complexity
O(N)