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 thehomepage
of the browser.void visit(string url)
Visitsurl
from the current page. It clears up all the forward history.string back(int steps)
Movesteps
back in history. If you can only returnx
steps in the history andsteps > x
, you will return onlyx
steps. Return the currenturl
after moving back in history at moststeps
.string forward(int steps)
Movesteps
forward in history. If you can only forwardx
steps in the history andsteps > x
, you will forward onlyx
steps. Return the currenturl
after 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)